Для пользовательской функции PostgreSQL позволяет явно указать стоимость вызова через
COST, а для функции, возвращающей набор строк, — ожидаемое число строк через ROWS. Причём пересоздавать функцию не обязательно:
ALTER FUNCTION find_orders(bigint)
ROWS 5;
ALTER FUNCTION expensive_check(jsonb)
COST 500;
Чем выше
COST, тем дороже планировщик считает вычисление и тем сильнее старается не выполнять его лишний раз. PostgreSQL прямо предоставляет
COST и ROWS как информацию для оптимизации пользовательских функций. EXPLAIN (ANALYZE, BUFFERS)
SELECT u.id, o.*
FROM users u
CROSS JOIN LATERAL find_orders(u.id) o;
🔥 Если пользовательская функция ломает оценки строк или вызывается слишком часто, проверьте
COST и ROWS — иногда правильный план получается без переписывания запроса и новых индексов.➡️ SQL Ready | #совет
