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前后的查询执行耗时。

  1. 准备测试表并写入数据。
    CREATE TABLE jit_test (id serial);
    INSERT INTO jit_test (id) select * from generate_series(1, 100000000);
    ANALYZE jit_test;
  2. 未开启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)
  3. 开启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)