Компиляция Just-in-Time (JIT) — это процесс преобразования
некоторой формы интерпретируемого выполнения программы в нативную программу,
выполняемый во время выполнения.
Например, вместо использования универсального кода, способного вычислять
произвольные SQL-выражения для вычисления конкретного SQL-предиката
вроде WHERE a.col = 3, можно сгенерировать
функцию, специфичную для этого выражения, которая может выполняться нативно
процессором, что даст прирост производительности.
Digital Q.DataBase имеет встроенную поддержку выполнения компиляции JIT с использованием LLVM.
Подробнее см. src/backend/jit/README.
В настоящее время реализация JIT в Digital Q.DataBase поддерживает ускорение вычисления выражений и преобразования кортежей. В будущем могут быть ускорены и другие операции.
Вычисление выражений используется для обработки условий WHERE,
целевых списков, агрегатов и проекций. Его можно ускорить,
генерируя специализированный код для каждого случая.
Преобразование кортежей — это процесс трансформации кортежа на диске (см. Раздел 7.15.6.1) в его представление в памяти. Его можно ускорить, создав функцию, специфичную для структуры таблицы и количества извлекаемых столбцов.
Digital Q.DataBase обладает высокой расширяемостью и позволяет определять новые типы данных, функции, операторы и другие объекты базы данных; см. Глава 5.1. Фактически встроенные объекты реализованы с использованием почти тех же механизмов. Эта расширяемость влечёт за собой некоторую накладные расходы, например, из-за вызовов функций (см. Раздел 5.1.3). Чтобы уменьшить эти расходы, компиляция JIT может встраивать тела небольших функций в выражения, которые их используют. Это позволяет устранить значительную часть накладных расходов.
LLVM поддерживает оптимизацию сгенерированного кода. Некоторые оптимизации достаточно дешёвы, чтобы выполняться при каждом использовании JIT, в то время как другие полезны только для долго выполняющихся запросов. Подробнее об оптимизациях см. https://llvm.org/docs/Passes.html#transform-passes.