在postgres 9.0上,將index_scan和seq_scan設置爲Off。爲什麼它將查詢性能提高2倍?Postgres查詢優化
回答
爲什麼?
最合乎邏輯的答案是因爲數據庫表的配置方式。
沒有你發佈你的表模式的我只能冒險猜測你的指數沒有高基數。
也就是說,如果你的索引含有太多有用的信息,那麼效率會低得多,或者確實比較慢。
基數是衡量索引中某一行的唯一性的度量。基數越低,查詢就會越慢。
一個完美的例子是在你的索引中有一個布爾型字段;也許你的數據庫裏有一個聯繫人表,它有一個布爾列,記錄真或假,取決於客戶是否希望被第三方聯繫。
意思是說,如果你沒有'選擇*從聯繫人的地方OptIn =真';你可以想象,你會返回一個很多的聯繫人;想象我們的案例中有50%的聯繫人。
現在,如果您將此'選擇'列添加到同一張表上的索引,它的理由是,無論其他選擇器有多好,由於「OptIn」的價值,您總會返回50%的表。
這是一個低基數的完美例子;它會很慢,因爲涉及該索引的任何查詢都必須選擇表中50%的行;然後能夠進一步應用WHERE過濾器來再次減少數據集。
長話短說;如果您的指數包含壞字段或僅僅表示表中的每一列;那麼SQL引擎必須求助於逐行測試行。
無論如何,以上是你的理論;但是爲什麼查詢突然開始花費更長時間是一個衆所周知的常見原因。
請填寫您的數據結構,索引定義和真正慢的實際查詢的差距!
這可能有助於一些查詢運行更快,但幾乎肯定會使其他查詢變慢。這是用於診斷目的的有趣信息,但是對於長期「解決方案」來說是一個壞主意。
PostgreSQL使用基於成本的優化器,該優化器根據通過掃描您的表(通常由自動清理)和成本計算因素收集的統計數據來查看所有可能計劃的成本。如果沒有選擇最快的計劃,通常是因爲您的成本因素不能準確地模擬您的環境的實際成本,統計數據不是最新的,或者統計數據不夠細。
開啓index_scan
和seq_scan
回來後:
我一般都發現
cpu_tuple_cost
默認太低;我經常看到更好的計劃,將其設置爲0.03而不是默認的0。01;我從來沒有見過這種重寫導致問題。如果數據庫的活動部分適合內存,請嘗試將
seq_page_cost
和random_page_cost
都減少到0.1。請務必將
effective_cache_size
設置爲shared_buffers
的總和,無論您的操作系統顯示爲緩存。永不禁用自動清理。您可能需要調整參數,但請謹慎操作,並進行小幅增量更改和後續監控。
您可能需要偶爾運行明確的
VACUUM ANALYZE
或ANALYZE
命令,尤其是對於剛剛進行了大量修改且即將用於查詢的臨時表或表。您可能想要增加
default_statistics_target
,from_collapse_limit
,join_collapse_limit
或某些geqo設置;但很難說沒有比迄今爲止提供的更多細節,這些內容是否合適。
您可以嘗試查詢用一個連接上設置不同的成本因素。當您確認一個適用於您的整個組合的配置(即,它可以在您的環境中準確模擬成本)時,您應該在postgresql.conf
文件中進行更新。
如果您需要更有針對性的幫助,請顯示錶格的結構,查詢本身以及針對查詢運行EXPLAIN ANALYZE
的結果。對您的操作系統和硬件的描述,以及PostgreSQL配置也會有所幫助。
- 1. 優化postgres查詢
- 2. 優化我的postgres查詢
- 3. 優化Postgres的前N個查詢
- 4. 查詢優化
- 5. 查詢優化
- 6. 優化查詢
- 7. 查詢優化
- 8. 查詢優化
- 9. 優化查詢
- 10. 查詢優化
- 11. 優化查詢
- 12. 查詢優化
- 13. 查詢優化
- 14. 查詢優化
- 15. 優化查詢
- 16. 查詢優化
- 17. 查詢優化
- 18. 優化查詢
- 19. 查詢優化
- 20. 優化查詢
- 21. MySQL查詢優化
- 22. 優化SQL查詢
- 23. 優化Mysql查詢,
- 24. MySQL查詢優化
- 25. MSSQL查詢優化
- 26. NHibernate查詢優化
- 27. 優化django查詢
- 28. 優化Mysql查詢
- 29. mySql優化查詢
- 30. 優化mysql查詢
我想它與您的查詢和數據結構有關。任何附加細節的機會? – iivel 2012-08-09 02:18:59