AnalyticDB PostgreSQL版7.0版本支持了即时编译(Just-In-Time,简称JIT),可以将某种形式的解释程序计算转变成原生程序,由CPU原生执行,从而得到加速。
背景信息
对于OLAP数据库来说,JIT即时编译是提高CPU密集型查询能力的有效手段。在AnalyticDB PostgreSQL版7.0版本支持JIT即时编译后,可以加速表达式计算(包括WHERE子句、目标列表、聚集以及投影等)以及元组拆解。
在大数据集时,对于单列聚集的场景,使用JIT进行计算会有15%~20%的性能提升。JIT编译技术可以让CPU密集型的查询受益,并且性能提升会随着数据量的增加而更加明显。但是需要注意的是,JIT在小数据集的场景下反而会因为有额外的JIT开销,其编译耗费的时间比其节省的时间还要多,从而导致性能下降。请根据自己的实际业务场景谨慎使用JIT。
示例
本示例用于对比开启JIT前后的查询执行耗时。
- 准备测试表并写入数据。
CREATE TABLE jit_test (id serial);
INSERT INTO jit_test (id) select * from generate_series(1, 100000000);
ANALYZE jit_test;
- 未开启JIT,并查看执行计划中的执行耗时,用于对比开启JIT后的执行耗时。
EXPLAIN ANALYZE SELECT avg(id) FROM jit_test;
执行计划返回信息如下,查询执行耗时为13445.055毫秒。
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------
Finalize Aggregate (cost=453326.89..453326.90 rows=1 width=32) (actual time=13444.050..13444.050 rows=1 loops=1)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=453326.83..453326.88 rows=3 width=32) (actual time=13064.601..13444.006 rows=3 loops=1)
-> Partial Aggregate (cost=453326.83..453326.84 rows=1 width=32) (actual time=13443.451..13443.452 rows=1 loops=1)
-> Seq Scan on jit_test (cost=0.00..369995.67 rows=33332467 width=4) (actual time=0.191..7151.999 rows=33335145 loops=1)
Optimizer: Postgres query optimizer
Planning Time: 0.447 ms
(slice0) Executor memory: 40K bytes.
(slice1) Executor memory: 38K bytes avg x 3 workers, 38K bytes max (seg0).
Memory used: 128000kB
Execution Time: 13445.055 ms
(10 rows)
- 开启JIT,并查看执行计划中的执行耗时。
SET jit to on;
SET optimizer to off;
EXPLAIN ANALYZE SELECT avg(id) FROM jit_test;
执行计划返回信息如下,对比步骤2和步骤3的查询执行耗时,可以看出开启JIT后,执行耗时缩短了1747.94毫秒,效果明显。
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------
Finalize Aggregate (cost=453326.89..453326.90 rows=1 width=32) (actual time=11695.112..11695.113 rows=1 loops=1)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=453326.83..453326.88 rows=3 width=32) (actual time=10926.392..11690.101 rows=3 loops=1)
-> Partial Aggregate (cost=453326.83..453326.84 rows=1 width=32) (actual time=11693.964..11693.965 rows=1 loops=1)
-> Seq Scan on jit_test (cost=0.00..369995.67 rows=33332467 width=4) (actual time=0.213..6529.483 rows=33335145 loops=1)
Optimizer: Postgres query optimizer
Planning Time: 0.492 ms
(slice0) Executor memory: 40K bytes.
(slice1) Executor memory: 38K bytes avg x 3 workers, 38K bytes max (seg0).
Memory used: 128000kB
JIT:
Functions: 4
Options: Inlining false, Optimization false, Expressions true, Deforming true
Timing: Generation 0.870 ms, Inlining 0.000 ms, Optimization 0.295 ms, Emission 4.462 ms, Total 5.627 ms
Execution Time: 11697.065 ms
(14 rows)