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