Postgresql
C 擴展:使用 ValuePerCall 或 Materialize 模式返回集合是否更快?
PostgreSQL 記錄了它的Set Returning Functions 和這樣的 C 擴展,
C 語言函式有兩個用於返回集合(多行)的選項。
- 在一種稱為**
ValuePerCall
mode**的方法中,重複呼叫一個返回集合的函式(每次傳遞相同的參數),並且在每次呼叫時返回一個新行,直到沒有更多行要返回,並通過返回 NULL 來發出信號。因此,set-returning 函式 (SRF) 必須在呼叫之間保存足夠的狀態以記住它在做什麼並在每次呼叫時返回正確的下一項。- 在另一種稱為**
Materialize
mode**的方法中, SRF 填充並返回一個包含其整個結果的 tuplestore 對象;那麼整個結果只發生一次呼叫,不需要呼叫間狀態。如果您正在優化執行速度,哪個更快**
ValuePerCall
或Materialize
**模式?顯然,物化模式將佔用更多記憶體,但如果您的目標是返回一整套,它似乎應該更快,但我沒有看到任何地方都有記錄。這些似乎在程式碼中記錄為Set Returning Function Mode
SFRM_ValuePerCall
和SFRM_Materialize
.
我對我的項目進行了相當徹底的基準測試。這是我發現的,
- 對於結果集適合
work_mem
Materialize
一個FROM
子句。- 對於大型集合,最好
ValuePerCell
在SELECT
列表中使用,對於帶有LIMIT
.你可以在我的回購中看到我的基準
pg-srf-repeat-benchmark
還有
SFRM_Materialize_Preferred
一個允許您編寫一個函式,該函式接受來自呼叫者的提示並且兩者都做。