Postgresql
在 CTE 的生命週期中,記憶體中保存了什麼?
假設一個多讀/多寫 CTE,在語句的生命週期中,記憶體中究竟保存了什麼?
RETURNING
是否在每個子語句結束時丟棄除數據之外的所有數據?
CTE 術語的輸出被累積到一個 TupleStore 中。TupleStore 可能在內部位於記憶體中,也可能溢出到磁碟。參見
src/include/utils/tuplestore.h
andsrc/backend/utils/sort/tuplestore.c
,尤其是頂部的註釋tuplestore.c
。對於將成為該
RETURNING
術語輸出的 wCTE。要確定是否保留了其他任何內容,需要分析執行每個 CTE 術語的記憶體上下文,因為 PostgreSQL 使用基於分層記憶體上下文的分配器。這裡你需要看看
src/backend/executor/nodeCtescan.c
。這很複雜,但是閱讀CteScanNext
表明查詢通常是並發執行的,一個查詢消耗另一個查詢的結果。所以。雖然記憶體可能會在每個子語句(CTE 術語)結束時被釋放,但不能保證任何 CTE 術語在任何特定時間結束。
改寫你的問題:
RETURNING
除了在下一個 CTE 術語執行之前丟棄的數據之外,是否所有來自 CTE 術語的記憶體數據答案是不”。
然而,這並不意味著 PostgreSQL 會將成堆的數據保存在記憶體中。它經常在處理完行後立即丟棄它們,並且永遠不需要再次查看它們。它可以將大量臨時結果溢出到磁碟上的臨時文件中。如果它實現、排序或聚合查詢輸出,它通常會在完成後丟棄未聚合/未排序的數據。等等。