2013-12-21 2 views
3

Предположим, что у меня есть функция STABLE SQL с одним параметром (внутренне функция выполняет SELECT в связке таблиц, хотя, насколько это касается вызывающего, функция на самом деле является просто черным ящиком).Выполняется ли функция кеша PostgreSQL?

Если эта функция вызывается несколько раз с тем же параметром в одном и том же выражении SELECT, достаточно унаследован от PostgreSQL, чтобы только на самом деле вызвать его один раз и кэшировать результат, или мне нужно выполнить кэширование вручную с помощью операторов WITH табличные выражения)?

+0

Попытка вручную «кэшировать» его с помощью CTE не гарантирует, что вы не назовете его несколько раз. Даже в тех системах, которые вызывают вызовы процедуры _can_ cache, вы обычно не можете это сделать, если он выполняет SQL-таблицу в таблице - поскольку оптимизатор может не иметь хорошего способа определить, были ли добавлены соответствующие строки в таблицу без повторного запуска запроса снова (в этот момент есть ответ ...). –

+0

@ Clockwork-Muse: эти соображения * не * применяются к Postgres, где все CTE одного запроса основаны на одном и том же снимке - независимо от параллельных транзакций. Итак, да, запрос CTE (WITH) полезен, чтобы избежать повторного выполнения. Подзапросы также могут выполнять работу и часто дешевле. –

ответ

7

В PostgreSQL нет кеша для результата стабильных функций (у него нет кеша для какого-либо результата функции). PostgreSQL пытается минимизировать количество вызовов, но у него нет кеша. Вы можете попытаться наказать эти вызовы более высоким атрибутом COST. Использование WITH должно быть хорошей идеей.

Смежные вопросы