AnalyticDB for PostgreSQL V7.0は、Just-In-Time (JIT) コンパイル機能をサポートしています。 この機能は、解釈されたプログラムの形式を、CPUが実行できるネイティブプログラムに変換します。 これは計算を加速する。
背景情報
JITコンパイルは、オンライン分析処理 (OLAP) データベースのCPUバインドクエリ機能を改善するための効果的な方法です。 AnalyticDB for PostgreSQL V7.0は、JITコンパイルを使用して、式 (WHERE句、リスト、集計、予測など) の計算とタプルのアンパックを高速化できます。
テーブルに大量のデータが含まれている場合は、JITコンパイルを使用して、単一列の集計シナリオで最大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コンパイルが有効になっていないときに、実行計画の実行期間を照会します。
EXPLAIN ANALYZE SELECT avg(id) FROM jit_test;
次の実行プランが返されます。 実行時間は13,445.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;
次の実行プランが返されます。 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)