2013-12-21 75 views
3

假設我有一個帶有一個參數的STABLE SQL函數(內部函數在一堆表上執行SELECT,但就調用者而言,函數實際上只是一個黑盒子)。PostgreSQL緩存函數調用?

如果在同一個SELECT語句中使用同一個參數多次調用此函數,那麼PostgreSQL是否足夠智能,只能實際調用一次並緩存結果,還是必須使用WITH語句手動執行緩存表表達式)?

+0

試圖用CTE手動「緩存」它不保證多次調用它。即使在_can_緩存過程調用的系統上,如果它在表上執行SQL,通常也無法執行此操作 - 因爲優化程序可能無法判斷相關行是否已添加到表中而無需重新運行查詢再次(在這一點上有答案...)。 –

+0

@ Clockwork-Muse:這些考慮*不適用於Postgres,其中單個查詢的所有CTE都基於相同的快照 - 獨立於併發事務。所以,是的,CTE(WITH查詢)對避免重複執行很有用。子查詢也可以完成這項工作,而且通常更便宜。 –

回答

7

PostgreSQL對於穩定函數的結果沒有緩存(它沒有任何函數結果的緩存)。 PostgreSQL儘量減少調用次數,但它沒有緩存。您可以嘗試通過更高的COST屬性來懲罰這些呼叫。使用WITH應該是個好主意。