31.2. Когда использовать JIT?#
31.2. Когда использовать JIT?
Сборка JIT (Just-In-Time) полезна в основном для долгосрочных запросов, связанных с использованием процессора. Часто это будут аналитические запросы. Для коротких запросов дополнительные издержки на выполнение сборки JIT часто будут выше, чем время, которое она может сэкономить.
Для определения необходимости использования компиляции JIT используется общая оценочная стоимость запроса (см. Глава 73 и Раздел 19.7.2). Оценочная стоимость запроса будет сравниваться с установкой jit_above_cost. Если стоимость выше, будет выполнена компиляция JIT. Затем требуется два дополнительных решения. Во-первых, если оценочная стоимость превышает установку jit_inline_above_cost, короткие функции и операторы, используемые в запросе, будут встроены. Во-вторых, если оценочная стоимость превышает установку jit_optimize_above_cost, применяются дорогостоящие оптимизации для улучшения сгенерированного кода. Каждая из этих опций увеличивает издержки на компиляцию JIT, но может значительно сократить время выполнения запроса.
Все эти решения, основанные на стоимости, будут приниматься на этапе планирования, а не на этапе выполнения. Это означает, что при использовании подготовленных операторов и использовании общего плана (см. PREPARE), значения параметров конфигурации, действующие на этапе подготовки, контролируют принимаемые решения, а не настройки на этапе выполнения.
Примечание
Если параметр 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, 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 также было бы уменьшено, это бы изменило ситуацию.