Postgresql

postgresql 在 UDF 中粘貼“enable_seqscan=False”是否明智?

  • December 23, 2021

我有一個查詢需要 40 秒才能在 80 毫秒內執行,如果 postgres 在哪裡過濾掉主鍵而不是進行順序掃描,它應該。我必須通過設置上述標誌來強制 postgres 過濾掉索引。

不得不將它粘貼到 UDF 對我來說似乎是一個相當大的技巧,我的意思是 IMO 查詢規劃器選擇對索引過濾器進行 seq 掃描是不合理的。我的大部分 SQL 經驗都來自 SQL Server,而且我還沒有經歷過這樣的基本優化失誤。

編輯: 對於任何感興趣的人,查詢執行時間從 80 毫秒下降到 27 毫秒,9.2,冬青莫利。

不要全域設置它,這導致糟糕的查詢計劃。但是有一些合理的案例enable_seqscan=False我在這裡引用手冊:

完全抑制順序掃描是不可能的,但是如果有其他可用的方法,關閉這個變數會阻止規劃器使用一個。預設值為on.

因此,如果由於某種原因,計劃程序繼續選擇順序掃描,而另一種類型的掃描會更快,這可能是您的醜陋修復 -僅針對此查詢。如果沒有其他路由可用,Postgres 仍將使用順序掃描。

當然,在大多數情況下,您只是掩蓋了潛在的問題——計劃者一開始就不應該錯誤的。您可能想開始探勘設置中的問題。是否autovacuum打開(預設),ANALYZE是否會自動針對您的表執行?試試手冊

ANALYZE mytable

甚至:

VACUUM FULL ANALYZE

首先。然後閱讀關於Planner Cost Constantsrandom_page_cost的章節,並蒐索此處或 SO等關鍵詞……

您的設置可能有問題。打包的預設值對於更大的數據庫幾乎沒有任何好處。

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