External merge 調教

古哥
pgsql-tw
Published in
Oct 5, 2021

本篇簡單地說明 PostgreSQL 在執行查詢時會發現 external merge 的情況,我們可以調整參數來予以加速。

首先建議大家可以使用 plan visualizer 的服務,比較容易檢視查詢計畫:

使用 EXPLAIN ANALYZE 產生的結果來進行效能調教,最重要的是:

不需要去看原始的 SQL

不需要去看原始的 SQL

不需要去看原始的 SQL

你只要貼上 plan 的內容就好了,你也不用糾結在語法怎麼寫,除非你需要回頭檢討資料邏輯。

以下說明雖然沒有辦法附上原始查詢,但你嘗試分析你的查詢,來找到類似的情況。

你可能會在某一個 node 裡找到類似這樣的資訊, Sort Space Type: Disk;注意,不要回頭去找 SQL 的哪個部份有 Sort。

你也可以對照一下你的原始 plan,找到類似這樣的內容,表示 PostgreSQL 在執行的時候,把資料放到 Disk 上處理了。如果要改善這一點的話,就是要讓它可以在記憶體中執行,而決策這個行為的設定是 work_mem。我的原始環境設定為 4MB,我打算增加它。

ALTER SYSTEM SET work_mem = '64MB';
SELECT pg_reload_conf();

變更這個設定值不用重啓服務,但要記得 reload。

再次執行產生查詢計畫,你可能會發現計畫的步驟改變了,執行的方式也改變了。其中,Sort Space Type: Memory,很明確地它在記憶體中執行,速度也確實加快了。

注意,因為查詢計畫改變了,使用空間其實不能直接比較。如果你要最佳化你的設定值,你必須僅參考調整後的最新查詢計畫。

work_mem 是每一個查詢獨立使用的記憶體,你要考慮到同時會有多少查詢在進行,設太大的話可能會造成服務崩潰。一旦你提高了 work_mem 的值,也許你也會需要降低 max_connections,或是從 connection pool 去減少 pool_size。

--

--

古哥
pgsql-tw

解決不了問題,就解決提出問題的人