PostgreSQL 11
正式版很快就能和我们见面了,该版本有一个和性能提升相关的重要特性 —— 对
JIT(just-in-time) 编译的支持。今年3月份我们曾报道过,在 TPC-H
等数据库测试中,发现用于 PostgreSQL 的 JIT 编译表达式速度快了不止
20%。在这种 JIT 模式下,创建索引的速度甚至可以提高 5~19%。

澳门新葡萄京官网注册,PostgreSQL 今年最酷最创新的一个特性就是基于 LLVM 的 JIT 支持 ——
可用于加速数据库查询。但据最新消息,在即将发布的 PostgreSQL 11
版本中,默认情况下不会启用该特性。

与此同时,数据库初创公司 Citus Data 也对 PostgreSQL 11 进行了一次 TPC-H
基准测试,而这次的测试结果显示性能又有了更高的提升。TPC-H 基准测试中的
Q1 查询十分适合用于测量新执行器堆栈在最佳状态下的表现,Citus Data
在本次测试中也使用了该查询。

该功能依赖于 LLVM for JIT 来编译 SQL 查询,通过利用 LLVM
的即时编译技术,而不是通过 PostgreSQL 的解释器来传递 SQL 查询,从而在
PostgreSQL 中通过 JIT 编译 SQL
查询,这可以更多地使用运行时信息,并且特别有助于提升复杂 SQL
查询的性能,从而生成更高效的代码。

关于 TPC-H 基准测试的规范请查看 TPC Benchmark™
H 的
137 页。规范中的每个查询都带有一个商业问题,Q1 查询的问题用 SQL
描述如下所示:

PostgreSQL JIT 在某些数据库基准测试中显示速度可提升 20%,最新 TPC-H Q1
测试显示 PostgreSQL JIT 带来了 30%
的性能提升,而像创建索引这样的基本任务则提升 5~19%。

select
    l_returnflag,
    l_linestatus,    sum(l_quantity) as sum_qty,    sum(l_extendedprice) as sum_base_price,    sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,    sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,    avg(l_quantity) as avg_qty,    avg(l_extendedprice) as avg_price,    avg(l_discount) as avg_disc,    count(*) as count_orderfrom
    lineitemwhere
    l_shipdate <= date '1998-12-01' - interval ':1' daygroup by
    l_returnflag,
    l_linestatusorder by
    l_returnflag,
    l_linestatus
:n -1;

PostgreSQL 11
还在开发中,已经在向正式版靠近了,当前最新的版本是 PostgreSQL 11 Beta
2。到目前为止,PostgreSQL 11 默认情况下已启用 JIT 功能,

最后的测试结果显示,PostgreSQL 11 在执行 TPCH Q1 查询时比 PostgreSQL 10
快 29.31%。当在循环中运行查询 10 分钟时,PostgreSQL 11 可执行 30 次,而
PostgreSQL 10 只能执行相同的查询 21 次。

之所以做出这个决定,是因为他们担心 JIT
后端会引入一些回归错误,而且现在还不够成熟,所以不会默认启用该功能。但在开发版的
Git 代码中,他们会继续保留这些代码,并为其进行额外的测试,希望在
PostgreSQL 12 中可默认启用该功能。

澳门新葡萄京官网注册 1

这个决定是本周末确定下来的,关于这个决定的更多细节,请查看
PostgreSQL
项目的邮件列表。

在 PostgreSQL 11 中,由于在查询方案中(query planning time)使用了 LLVM
编译器基础结构,SQL
表达式会被转换为机器代码,这大大提升了查询方面的性能。对于那些足够昂贵的查询、那些进行大量编译行并一遍又一遍地评估表达式的查询,其带来的好处不言而喻。

(文/开源中国)    

关于测试的详细内容请点此查看。