2012-08-09 95 views
1

在postgres 9.0上,將index_scan和seq_scan設置爲Off。爲什麼它將查詢性能提高2倍?Postgres查詢優化

+0

我想它與您的查詢和數據結構有關。任何附加細節的機會? – iivel 2012-08-09 02:18:59

回答

0

爲什麼?

最合乎邏輯的答案是因爲數據庫表的配置方式。

沒有你發佈你的表模式的我只能冒險猜測你的指數沒有高基數。

也就是說,如果你的索引含有太多有用的信息,那麼效率會低得多,或者確實比較慢。

基數是衡量索引中某一行的唯一性的度量。基數越低,查詢就會越慢。

一個完美的例子是在你的索引中有一個布爾型字段;也許你的數據庫裏有一個聯繫人表,它有一個布爾列,記錄真或假,取決於客戶是否希望被第三方聯繫。

意思是說,如果你沒有'選擇*從聯繫人的地方OptIn =真';你可以想象,你會返回一個很多的聯繫人;想象我們的案例中有50%的聯繫人。

現在,如果您將此'選擇'列添加到同一張表上的索引,它的理由是,無論其他選擇器有多好,由於「OptIn」的價值,您總會返回50%的表。

這是一個低基數的完美例子;它會很慢,因爲涉及該索引的任何查詢都必須選擇表中50%的行;然後能夠進一步應用WHERE過濾器來再次減少數據集。

長話短說;如果您的指數包含壞字段或僅僅表示表中的每一列;那麼SQL引擎必須求助於逐行測試行。

無論如何,以上是你的理論;但是爲什麼查詢突然開始花費更長時間是一個衆所周知的常見原因。

請填寫您的數據結構,索引定義和真正慢的實際查詢的差距!

1

這可能有助於一些查詢運行更快,但幾乎肯定會使其他查詢變慢。這是用於診斷目的的有趣信息,但是對於長期「解決方案」來說是一個壞主意。

PostgreSQL使用基於成本的優化器,該優化器根據通過掃描您的表(通常由自動清理)和成本計算因素收集的統計數據來查看所有可能計劃的成本。如果沒有選擇最快的計劃,通常是因爲您的成本因素不能準確地模擬您的環境的實際成本,統計數據不是最新的,或者統計數據不夠細。

開啓index_scanseq_scan回來後:

  • 我一般都發現cpu_tuple_cost默認太低;我經常看到更好的計劃,將其設置爲0.03而不是默認的0。01;我從來沒有見過這種重寫導致問題。

  • 如果數據庫的活動部分適合內存,請嘗試將seq_page_costrandom_page_cost都減少到0.1。

  • 請務必將effective_cache_size設置爲shared_buffers的總和,無論您的操作系統顯示爲緩存。

  • 永不禁用自動清理。您可能需要調整參數,但請謹慎操作,並進行小幅增量更改和後續監控。

  • 您可能需要偶爾運行明確的VACUUM ANALYZEANALYZE命令,尤其是對於剛剛進行了大量修改且即將用於查詢的臨時表或表。

  • 您可能想要增加default_statistics_target,from_collapse_limit,join_collapse_limit或某些geqo設置;但很難說沒有比迄今爲止提供的更多細節,這些內容是否合適。

您可以嘗試查詢用一個連接上設置不同的成本因素。當您確認一個適用於您的整個組合的配置(即,它可以在您的環境中準確模擬成本)時,您應該在postgresql.conf文件中進行更新。

如果您需要更有針對性的幫助,請顯示錶格的結構,查詢本身以及針對查詢運行EXPLAIN ANALYZE的結果。對您的操作系統和硬件的描述,以及PostgreSQL配置也會有所幫助。