Пользовательские функции (User-Defined Functions, UDF) уже давно используются для расширения возможностей баз данных и добавления кастомного функционала, необходимого для решения специфических задач. Однако, несмотря на их полезность, производительность UDF часто оставляет желать лучшего, что ограничивает их применение в системах с высокими требованиями к скорости обработки данных. Многие разработчики избегают использовать UDF в критичных с точки зрения производительности проектах, что приводит к серьезным ограничениям при построении гибких и эффективных приложений. Современные исследования в области баз данных и программирования направлены на решение этой проблемы и раскрытие потенциала UDF через улучшение методов их компиляции и интеграции в выполнение SQL-запросов. Одним из ярких примеров таких исследований является диссертационная работа Дениса Хирна, выполненная в Университете Тюбингена в 2024 году, которая предлагает новый подход к компиляции сложных пользовательских функций, основанный на методах из области языков программирования.
Одной из ключевых проблем в реализации UDF является так называемое несоответствие между императивным стилем программирования, применяемым в PL/SQL и аналогичных диалектах, и декларативным плановым подходом, характерным для обработки SQL-запросов. Когда выполнение функции требует пошагового исполнения инструкций с циклами и условными операторами, возникает значительное замедление из-за постоянного переключения между интерпретатором PL/SQL и SQL-движком. Существующие решения либо способны эффективно компилировать только простые функции с линейным потоком управления, либо требуют внесения нестандартных расширений в СУБД, что негативно сказывается на переносимости и масштабируемости. Представленный в работе подход основан на технике под названием trampolined style, которая позволяет преобразовать UDF с любой сложностью циклического управления потоком в чистые SQL-запросы. После такой компиляции необходимость в интерпретаторе PL/SQL полностью отпадает, а вся логика вычислений перемещается в механизм выполнения SQL.
Это позволяет устранить традиционное замедление и накладные расходы на переключения, а также раскрыть потенциал оптимизаторов запросов, которые получают возможность анализировать и оптимизировать вычисления целиком. Кроме того, поскольку итоговые запросы написаны на стандартизированном SQL, их можно запускать в любых современных системах, поддерживающих LATERAL-присоединения и рекурсивные Common Table Expressions (CTE), даже если в этих системах нет нативной поддержки UDF. Проведенные эксперименты с коллекцией из восемнадцати различных пользовательских функций подтвердили эффективность метода, показав ускорение выполнения в несколько раз по сравнению с традиционными реализациями. При этом была обнаружена и обратная сторона — в некоторых случаях реализация могла ухудшать производительность, что обусловлено особенностями оптимизации конкретных запросов. В диссертации подробно разбираются причины таких ситуаций и предлагаются рекомендации по их предотвращению.
Второй аспект исследования посвящен рекурсивным UDF, которые традиционно страдают от ещё более существенных проблем с производительностью. В частности, в системах, таких как PostgreSQL, рекурсивные вызовы функций сопровождаются повторным анализом и планированием на каждый вызов, что приводит к огромным накладным расходам и делает практическое использование таких функций малопривлекательным. Здесь предлагается принять рекурсию за данность и использовать проверенные методы из программирования для компиляции рекурсивных функций в рекурсивные SQL-запросы. Повторное применение trampolined style позволяет избежать избыточных затрат на интерпретацию, и после компиляции функционал рекурсии становится неотличим от высокопроизводительных SQL-вычислений. Для проверки этого подхода была подготовлена коллекция из десяти рекурсивных функций.
Экспериментальные результаты впечатляют: компиляция устраняет свыше 90% накладных расходов, обеспечивая ускорение в сотни раз. Данный факт демонстрирует, что хотя SQL и не является функциональным языком программирования в традиционном понимании, при грамотном подходе он может эффективно реализовывать сложные вычислительные процессы с сохранением гибкости и производительности. Значение данной работы трудно переоценить. Во-первых, она развеивает миф о том, что UDF обязательно должны иметь серьезные проблемы с производительностью. Во-вторых, в ней раскрывается мощь trampolined style в контексте SQL, что открывает новые горизонты для реализующих универсальные и эффективные компиляторы UDF.
Набор правил и техник, изложенных в работе, может служить отправной точкой для создания оптимизирующих компиляторов в любых системах баз данных, поддерживающих современные возможности SQL-запросов. Это является важным шагом на пути к унификации и универсализации методов расширения функционала баз данных, сохраняя при этом высокие стандарты производительности. Кроме того, внедрение таких компиляционных техник может значительно упростить жизнь разработчикам, так как им не нужно будет ограничиваться лишь простыми функциями или прибегать к специфическим расширениям и обходным решениям. Комплексный автоматизированный инструмент преобразования сложных UDF в чистый SQL позволяет сохранить привычный декларативный стиль обработки данных и эффективно использовать встроенные механизмы оптимизации СУБД. В будущем можно ожидать, что данные методы найдут широкое применение не только в традиционных реляционных базах данных, но и в новых гибридных и облачных решениях, где масштабируемость и портируемость играют ключевую роль.