Предположим, что у меня есть функция STABLE SQL с одним параметром (внутренне функция выполняет SELECT в связке таблиц, хотя, насколько это касается вызывающего, функция на самом деле является просто черным ящиком).Выполняется ли функция кеша PostgreSQL?
Если эта функция вызывается несколько раз с тем же параметром в одном и том же выражении SELECT, достаточно унаследован от PostgreSQL, чтобы только на самом деле вызвать его один раз и кэшировать результат, или мне нужно выполнить кэширование вручную с помощью операторов WITH табличные выражения)?
Попытка вручную «кэшировать» его с помощью CTE не гарантирует, что вы не назовете его несколько раз. Даже в тех системах, которые вызывают вызовы процедуры _can_ cache, вы обычно не можете это сделать, если он выполняет SQL-таблицу в таблице - поскольку оптимизатор может не иметь хорошего способа определить, были ли добавлены соответствующие строки в таблицу без повторного запуска запроса снова (в этот момент есть ответ ...). –
@ Clockwork-Muse: эти соображения * не * применяются к Postgres, где все CTE одного запроса основаны на одном и том же снимке - независимо от параллельных транзакций. Итак, да, запрос CTE (WITH) полезен, чтобы избежать повторного выполнения. Подзапросы также могут выполнять работу и часто дешевле. –