Компиляция JIT полезна в первую очередь для долго выполняющихся CPU-интенсивных запросов. Часто это аналитические запросы. Для коротких запросов дополнительные накладные расходы на выполнение компиляции JIT часто будут превышать время, которое она может сэкономить.
Чтобы определить, следует ли использовать компиляцию JIT, используется общая предполагаемая стоимость запроса (см. Глава 7.18 и Раздел 3.4.7.2). Предполагаемая стоимость запроса будет сравниваться с настройкой jit_above_cost. Если стоимость выше, будет выполнена компиляция JIT. Затем требуются два дополнительных решения. Во-первых, если предполагаемая стоимость превышает значение настройки jit_inline_above_cost, короткие функции и операторы, используемые в запросе, будут встроены. Во-вторых, если предполагаемая стоимость превышает значение настройки jit_optimize_above_cost, применяются дорогостоящие оптимизации для улучшения сгенерированного кода. Каждая из этих опций увеличивает накладные расходы на компиляцию JIT, но может значительно сократить время выполнения запроса.
Эти решения на основе стоимости принимаются на этапе планирования, а не выполнения. Это означает, что при использовании подготовленных выражений и использовании универсального плана (см. PREPARE), решения контролируются значениями параметров конфигурации, действующими на момент подготовки, а не настройками на момент выполнения.
Если для параметра jit установлено значение off или если
реализация JIT недоступна (например, потому что
сервер был скомпилирован без --with-llvm),
компиляция JIT выполняться не будет, даже если она была бы
полезна согласно приведённым выше критериям. Установка jit
в значение off влияет как на этап планирования, так и на этап выполнения.
Для проверки использования JIT можно использовать команду EXPLAIN. В качестве примера приведём запрос, который не использует 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 (Deform 0.000 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, это изменило бы ситуацию.