Список докладов конференции PgConf.Russia 2017
Динамическая компиляция SQL-запросов в PostgreSQL с использованием LLVM JIT

ИСП РАН, разработчик
Дмитрий более 10 лет занимается разработкой и оптимизацией компиляторов в Институте системного программирования РАН. До начала работы над PostgreSQL принимал участие в работе над open source проектами -- компиляторами GCC, LLVM, и JIT-компиляторами JavaScript (WebKit/JSC и V8). В данный момент работает над JIT-компилятором в PostgreSQL.
В данный момент в PostgreSQL для исполнения SQL-запросов применяется интерпретатор, реализующий модель итераторов (Volcano-модель). В то же время можно добиться существенного ускорения, выполняя динамическую компиляцию запроса «на лету». В этом случае можно генерировать код, специализированный для конкретного SQL-запроса, а также применять компиляторные оптимизации, учитывая, что во время выполнения уже известна структура используемых таблиц и типы данных. Такой подход особенно актуален для сложных запросов, скорость выполнения которых ограничена производительностью процессора.
Кроме того, будут рассмотрены изменения в архитектуре PostgreSQL, необходимые для эффективного применения динамической компиляции. Так, необходимо перейти от используемой в PostgreSQL модели итераторов к модели явной итерации ("push"-модели), т.к. особенности первой модели (виртуальные вызовы и сохранение внутреннего состояния в узлах дерева плана) не позволяют динамическому компилятору эффективно оптимизировать код.
Также будет рассмотрен метод автоматической кодогенерации во время динамической компиляции кода встроенных функций СУБД, используемых в запросах, который позволяет использовать один и тот же исходный код как для JIT-компилятора, так и для интерпретатора.
В результате применения предлагаемого подхода удалось добиться существенного ускорения на наборе тестов TPC-H. Для динамической компиляции выражений ускорение составляет 20% (код опубликован в открытом доступе: github.com/ispras/postgres). Для разработанного расширения PostgreSQL, реализующего описанные оптимизации на всех этапах выполнения запроса, на том же наборе тестов получено ускорение до пяти раз.