3
Функции в базе данных
Основной мотив: упрощение задачи
интерфейс (параметры) и реализация (тело функции)
о функции можно думать вне контекста всей задачи
Традиционные языки PostgreSQL
побочные глобальные переменные вся база данных
эффекты (категории изменчивости)
модули со своим интерфейсом пространства имен,
и реализацией клиент и сервер
сложности накладные расходы скрытие запроса
на вызов от планировщика
(подстановка) (подстановка,
подзапросы, представления)
Основная цель появления функций в программировании вообще —
упростить решаемую задачу за счет ее декомпозиции на более мелкие
подзадачи. Упрощение достигается за счет того, что о функции можно
думать, абстрагировавшись от «большой» задачи. Для этого функция
определяет четкий интерфейс с внешним миром (параметры
и возвращаемое значение). Ее реализация (тело функции) может
меняться; вызывающая сторона «не видит» этих изменений и не
зависит от них. Этой идеальной ситуации может мешать глобальное
состояние (глобальные переменные), и надо учитывать, что в случае
БД таким состоянием является вся база данных.
В традиционных языках функции часто объединяются в модули
(пакеты, классы для ООП и т. п.), имеющие собственный интерфейс
и реализацию. Границы модулей могут проводиться более или менее
произвольно. Для PostgreSQL есть жесткая граница между клиентской
частью и серверной: серверный код работает с базой, клиентский —
управляет транзакциями. Модули (пакеты) отсутствуют, есть только
пространства имен.
Для традиционных языков единственный минус широкого
использования функций состоит в накладных расходах на их вызов.
Иногда его преодолевают с помощью подстановки (inlining) кода
функции в вызывающую программу. Для БД последствия могут быть
более серьезные: если в функцию выносится часть запроса,
планировщик перестает видеть «общую картину» и не может построить
хороший план. В некоторых случаях PostgreSQL умеет выполнять
подстановку; альтернативные варианты — использование подзапросов
или представлений.