Postgresql

在 CTE 的生命週期中,記憶體中保存了什麼?

  • February 6, 2015

假設一個多讀/多寫 CTE,在語句的生命週期中,記憶體中究竟保存了什麼?

RETURNING是否在每個子語句結束時丟棄除數據之外的所有數據?

CTE 術語的輸出被累積到一個 TupleStore 中。TupleStore 可能在內部位於記憶體中,也可能溢出到磁碟。參見src/include/utils/tuplestore.hand src/backend/utils/sort/tuplestore.c,尤其是頂部的註釋tuplestore.c

對於將成為該RETURNING術語輸出的 wCTE。

要確定是否保留了其他任何內容,需要分析執行每個 CTE 術語的記憶體上下文,因為 PostgreSQL 使用基於分層記憶體上下文的分配器。這裡你需要看看src/backend/executor/nodeCtescan.c。這很複雜,但是閱讀CteScanNext表明查詢通常是並發執行的,一個查詢消耗另一個查詢的結果。

所以。雖然記憶體可能會在每個子語句(CTE 術語)結束時被釋放,但不能保證任何 CTE 術語在任何特定時間結束。

改寫你的問題:

RETURNING除了在下一個 CTE 術語執行之前丟棄的數據之外,是否所有來自 CTE 術語的記憶體數據

答案是不”。

然而,這並不意味著 PostgreSQL 會將成堆的數據保存在記憶體中。它經常在處理完行後立即丟棄它們,並且永遠不需要再次查看它們。它可以將大量臨時結果溢出到磁碟上的臨時文件中。如果它實現、排序或聚合查詢輸出,它通常會在完成後丟棄未聚合/未排序的數據。等等。

引用自:https://dba.stackexchange.com/questions/91136