Postgresql
postgresql 在 UDF 中粘貼“enable_seqscan=False”是否明智?
我有一個查詢需要 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 Constants
random_page_cost
的章節,並蒐索此處或 SO等關鍵詞……您的設置可能有問題。打包的預設值對於更大的數據庫幾乎沒有任何好處。