2013-03-01 42 views
3

對我的一個查詢(Postgres)進行了多次測試後,我意識到通過設置enable_seqscan = off,查詢花費其原始時間的1/3(使用psql控制檯和EXPLAIN ANALYZE在單個SELECT查詢中設置enable_seqscan = off

由於不建議爲整個服務器更改此設置,因此我只想將該設置設置爲OFF
我該怎麼做?可能嗎?

我的實現基於框架Kohana(PHP),它使用DB對象(DB :: select)來執行查詢。

我的postgres在CentOS Linux上是8.4.9。

回答

8

您可以在您的交易中使用SET LOCAL。我引用的手冊:

SET LOCAL的影響只持續到當前事務結束,無論是否承諾。

但這就像吃抗生素,當你不斷髮病而不是找到原因。通常有一個原因,爲什麼計劃者選擇一個不理想的計劃,你應該找到並解決這個問題。閱讀答案更多,根據此相關的問題:
Keep PostgreSQL from sometimes choosing a bad query plan

我特別懷疑降低的設定random_page_cost可能是一個好主意。默認設置通常太保守(太高)。如果大部分或全部數據庫都被緩存(系統緩存對於重複使用並適用於RAM的內存),那麼random_page_cost幾乎可以與seq_page_cost一樣低(或者在極端情況下也是如此)。 random_page_cost是計算索引使用成本的主要因素。

並確保自動清理運行並正確配置(照顧VACUUMANALYZE)。您需要您的統計數據以及時瞭解適當的查詢計劃。

effective_cache_size定期設置太低開箱。

例外情況適用,有時候查詢計劃者只是不明白,特別是對於舊版本。這使我想到另一個微妙點:upgrade to a more current version of PostgreSQL。穩定版本是9.2。自從Postgres 8.4以來,查詢規劃器已經有了很大的改進。

+0

在實際情況下,您的用戶受到影響,您並不總是可以隨時進行全面調查或重新啓動數據庫。至少Postgres應該像所有其他主要的RDBMS一樣提供索引提示,這樣當你處理更好的永久性解決方案時,可以讓事情順利進行。 – thomasfuchs 2015-01-18 23:52:44