他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

32.2. どんなときにJITを使うべきか? #

JITコンパイルは、主に長時間実行するCPUバウンドの問い合わせに有益です。 短い問い合わせでは、JITコンパイルを行うことにより加わるオーバーヘッドはしばしばそれによって短縮できる時間よりも大きくなるでしょう。

JITコンパイルを使うべきかどうかを決めるために、問い合わせの合計推定コスト(第76章20.7.2を参照)が使用されます。 問い合わせの推定コストはjit_above_costの設定と比較されます。 もしもそのコストが大きければ、JITコンパイルが実行されます。 さらなる二つの決定が必要になります。 まず、推定コストがjit_inline_above_costの設定よりも大きければ、問い合わせ中で使用される短い関数と演算子がインライン展開されます。 次に、推定コストがjit_optimize_above_costの設定よりも大きければ、生成コードを改善するために、高価な最適化が適用されます。 これらのオプションはJITコンパイルのオーバーヘッドを大きくしますが、かなりクエリの実行時間を短縮します。

これらのコストに基づく決定は実行時ではなく、プラン時に行われます。 このことは、準備された文が使われ、汎用プラン(PREPARE参照)が用いられるときには、実行時ではなく、準備時に参照される設定パラメータの値が決定を左右することを意味します。

注記

jitoffか、JIT実装が適用外(たとえばサーバが--with-llvm付きでコンパイルされていない)場合は、たとえ上記の基準からは有益であったとしてもJITは実行されません。 jitoffにすると、プラン時と実行時の両方に影響を与えます。

EXPLAINを使ってJITが使われているかどうかを確認できます。 JITを使っていない例を示します。

=# EXPLAIN ANALYZE SELECT SUM(relpages) FROM pg_class;
                                                 QUERY PLAN
-------------------------------------------------------------------​------------------------------------------
 Aggregate  (cost=16.27..16.29 rows=1 width=8) (actual time=0.303..0.303 rows=1 loops=1)
   ->  Seq Scan on pg_class  (cost=0.00..15.42 rows=342 width=4) (actual time=0.017..0.111 rows=356 loops=1)
 Planning Time: 0.116 ms
 Execution Time: 0.365 ms
(4 rows)

プランに与えられたコストによれば、JITが使われないのは完全に合理的です。 JITのコストは潜在的な節約よりも大きいのです。 コスト上限を調整すると、JITが使われるようになります。

=# SET jit_above_cost = 10;
SET
=# EXPLAIN ANALYZE SELECT SUM(relpages) FROM pg_class;
                                                 QUERY PLAN
-------------------------------------------------------------------​------------------------------------------
 Aggregate  (cost=16.27..16.29 rows=1 width=8) (actual time=6.049..6.049 rows=1 loops=1)
   ->  Seq Scan on pg_class  (cost=0.00..15.42 rows=342 width=4) (actual time=0.019..0.052 rows=356 loops=1)
 Planning Time: 0.133 ms
 JIT:
   Functions: 3
   Options: Inlining false, Optimization false, Expressions true, Deforming true
   Timing: Generation 1.259 ms, Inlining 0.000 ms, Optimization 0.797 ms, Emission 5.048 ms, Total 7.104 ms
 Execution Time: 7.416 ms

これを見るとわかるように、JITは使われていますが、インライン展開と高価な最適化は行われていません。 加えてjit_inline_above_costあるいはjit_optimize_above_costを小さくすれば、これは変わることでしょう。