Список докладов конференции PgConf.Russia 2017

Динамическая компиляция SQL-запросов в PostgreSQL с использованием LLVM JIT

Дмитрий Мельник
ИСП РАН, разработчик

Дмитрий более 10 лет занимается разработкой и оптимизацией компиляторов в Институте системного программирования РАН. До начала работы над PostgreSQL принимал участие в работе над open source проектами -- компиляторами GCC, LLVM, и JIT-компиляторами JavaScript (WebKit/JSC и V8). В данный момент работает над JIT-компилятором в PostgreSQL.

В данный момент в PostgreSQL для исполнения SQL-запросов применяется интерпретатор, реализующий модель итераторов (Volcano-модель). В то же время можно добиться существенного ускорения, выполняя динамическую компиляцию запроса «на лету». В этом случае можно генерировать код, специализированный для конкретного SQL-запроса, а также применять компиляторные оптимизации, учитывая, что во время выполнения уже известна структура используемых таблиц и типы данных. Такой подход особенно актуален для сложных запросов, скорость выполнения которых ограничена производительностью процессора. В докладе будет рассмотрено применение динамической компиляции с использованием компиляторной инфраструктуры LLVM для ускорения различных этапов выполнения SQL-запросов: - компиляция выражений; - компиляция методов сканирования, агрегации, сортировки и объединения, используемых в плане выполнения запроса; - компиляция построения индексов; - сохранение скомпилированного кода для PREPARED операторов для ускорения OLTP запросов.

Кроме того, будут рассмотрены изменения в архитектуре PostgreSQL, необходимые для эффективного применения динамической компиляции. Так, необходимо перейти от используемой в PostgreSQL модели итераторов к модели явной итерации ("push"-модели), т.к. особенности первой модели (виртуальные вызовы и сохранение внутреннего состояния в узлах дерева плана) не позволяют динамическому компилятору эффективно оптимизировать код.

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

В результате применения предлагаемого подхода удалось добиться существенного ускорения на наборе тестов TPC-H. Для динамической компиляции выражений ускорение составляет 20% (код опубликован в открытом доступе: github.com/ispras/postgres). Для разработанного расширения PostgreSQL, реализующего описанные оптимизации на всех этапах выполнения запроса, на том же наборе тестов получено ускорение до пяти раз.

ВИДЕО

Слайды