Перейти к основному содержимому

Что такое JIT-компиляция?

примечание

Эта страница переведена при помощи нейросети GigaChat.

JIT-компиляция (Just-in-Time compilation, Компиляция «точно в срок») — это процесс преобразования интерпретируемого кода в машинный код непосредственно во время выполнения программы. Например, вместо использования универсального кода, который может оценивать произвольные выражения SQL для оценки конкретного SQL-предиката, такого как WHERE a.col = 3, можно создать функцию, специфичную для этого выражения, которая может быть выполнена непосредственно центральным процессором, что дает увеличение скорости.

PostgreSQL имеет встроенную поддержку для выполнения компиляции JIT с использованием LLVM при сборке PostgreSQL с помощью --with-llvm.

См. src/backend/jit/README для получения дополнительных сведений.

Ускорение операций с помощью JIT

В настоящее время реализация PostgreSQL JIT поддерживает ускорение оценки выражений и деформации кортежей. В будущем могут быть ускорены несколько других операций.

Оценка выражения используется для оценки WHERE предложений, целевых списков, агрегатов и проекций. Оно может быть ускорено путем создания кода, специфичного для каждого случая.

Изменение кортежа - это процесс преобразования кортежа на диске (см. раздел «Компоновка страницы базы данных») в его представление в памяти. Его можно ускорить путем создания функции, специфичной для компоновки таблицы и количества столбцов, которые должны быть извлечены.

Встраивание

PostgreSQL очень расширяем и позволяет определять новые типы данных, функции, операторы и другие объекты базы данных (см. раздел «Расширение SQL»). На самом деле встроенные объекты реализованы с использованием почти тех же механизмов. Эта расширяемость подразумевает некоторые накладные расходы, например из-за вызовов функций (см. раздел «Пользовательские функции»). Чтобы уменьшить эти накладные расходы, компиляция JIT может встраивать тела небольших функций в выражения, использующие их. Это позволяет оптимизировать значительную часть накладных расходов.

Оптимизация

LLVM поддерживает оптимизацию генерируемого кода. Некоторые оптимизации достаточно дешевы для выполнения при каждом использовании JIT, в то время как другие полезны только для более длительных запросов. См. https://llvm.org/docs/Passes.html#transform-passes для получения дополнительной информации об оптимизациях.