Институт системного программирования Роcсийской академии наук


Динамическая компиляция SQL-запросов для СУБД

В последние годы по мере увеличения производительности и роста объема оперативной и внешней памяти производительность СУБД для некоторых классов запросов определяется непосредственно скоростью обработки запросов процессором.

Для исполнения SQL-запросов в большинстве современных реляционных СУБД используется модель итераторов, которая удобна в реализации в рамках интерпретатора запросов, но сопряжена с существенными накладными расходами при выполнении плана, например, связанным с множественным ветвлением, неявными вызовами функций-обработчиков и выполнением лишних проверок, избежать которых довольно сложно при использовании механизма интерпретации.

Одно из решений – динамическая компиляция запросов, которая позволяет значительно увеличить производительность СУБД на запросах, скорость обработки которых, в первую очередь определяется эффективностью использования процессора. Динамическая компиляция с использованием информации, доступной только во время выполнения запроса, позволяет генерировать код, специализированный под конкретный запрос, и использовать модель выполнения, не накладывающую дополнительных расходов во время выполнения.

В рамках данного проекта был разработан метод динамической компиляции запросов с применением альтернативной модели выполнения запроса в СУБД, что подразумевает отказ от используемой в PostgreSQL итеративной Volcano-модели, и его реализацию для СУБД PostgreSQL с помощью компиляторной инфраструктуры LLVM. Реализация данного метода позволяет применить множество оптимизаций, доступных только на этапе выполнения.

Также разрабатывается метод динамической специализации исходного кода СУБД на уровне промежуточного представления LLVM применительно к разработанному динамическому компилятору запросов для СУБД PostgreSQL, что позволит избежать переписывания на LLVM API и постоянной поддержки и обновления части исходного кода PostgreSQL, ответственной за вычисление планов.

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

Работа выполнена в виде расширения к PostgreSQL, что не требует изменения исходного кода самой СУБД.

Статьи и доклады на конференциях

Мельник Д.М. Ускорение исполнения запросов в PostgreSQL с использованием JIT-компилятора LLVM. Международная конференция PgConf.Russia 2016.

Мельник Д.М. PostgreSQL using LLVM JIT Compiler. Международная конференция LLVM Cauldron 2016.

Разработчик/участник

Компиляторные технологии

Перейти к списку всех технологий