Что такое функции в базе данных
Что проверяют
Понимаете ли вы, что часть логики можно вынести на сторону базы, и умеете ли взвешивать это решение, а не только назвать синтаксис. Для разработчика на Go вопрос почти всегда продолжается практикой: как такая функция вызывается через database/sql или pgx, что происходит с планом запроса и где этот код будет версионироваться.
Как отвечать
Функция в базе это именованный блок кода, который принимает параметры, выполняется на сервере СУБД и возвращает значение или набор строк. Пишут их на SQL или на процедурном языке вроде PL/pgSQL.
create or replace function active_users(since timestamptz)
returns table (id bigint, email text)
language sql stable as $$
select id, email from users where last_seen >= since
$$;Из Go это обычный запрос, отдельного механизма не требуется:
rows, err := db.QueryContext(ctx, "select id, email from active_users($1)", since)Сильный ответ добавляет три вещи. Категория изменчивости: пометки immutable, stable, volatile говорят планировщику, можно ли вычислить функцию один раз и допустима ли она в индексе по выражению. Права: security definer позволяет дать доступ к операции, не выдавая прав на таблицы. И граница с процедурой: функция возвращает значение и работает внутри транзакции вызывающего, процедура вызывается через call и может управлять транзакцией сама.
Где спотыкаются
Оставляют изменчивость по умолчанию. Без пометки функция считается изменяемой, планировщик вызывает её на каждую строку и не пускает в индекс по выражению, а запрос неожиданно начинает читать таблицу целиком.
Прячут за функцией сложную выборку и удивляются плану. Тело на PL/pgSQL для оптимизатора чёрный ящик, внешние условия внутрь не проталкиваются. Простую выборку лучше писать на языке sql, тогда её тело может быть встроено в запрос.
Не кладут функции в миграции. Код на сервере базы это такой же код: без файла в репозитории он расходится между стендами, и ни обзора, ни отката по нему уже не сделать.