2009-06-17 59 views
4

我遇到這樣的情況,即運行按分區表中的索引列進行篩選的查詢執行全表掃描。如何在postgresql中的分區表上使用索引8.3.7

顯然,這是postgresql中的一個已知問題,詳細解釋如下:here

除了在每個分區上執行查詢,然後在所有結果上執行UNION之外,有沒有更優雅的解決方法?

+0

請在此處查詢Postgres性能郵件列表http://archives.postgresql.org/pgsql-performance/。 – 2009-06-17 15:21:14

回答

10

索引工作得很好,只掃描PostgreSQL中的相關分區。但是,你必須正確設置好一切爲它工作,而且很容易錯過的東西記錄的長列表中的一步http://www.postgresql.org/docs/current/static/ddl-partitioning.html

實現的主要問題是,爲了避免順序掃描,你必須向PostgreSQL提供足夠的信息,以便可以證明某些分區無法獲得您要查找的數據;那麼它們被跳過作爲查詢結果的潛在來源。您鏈接的文章指出這是seq掃描問題的解決方案:「如果您將範圍約束添加到每個分區的日期字段,則可以將該查詢優化爲一個循環,您可以先查詢」最新「分區並進行工作直到找到一個高於所有剩餘分區範圍的單個值。「 - 但沒有顯示您在更改後看到的改進計劃。

你可能已經取得了一些常見的錯誤:

在postgresql.conf文件-The constraint_exclusion參數默認是關閉的。有了這個默認值,你不會得到你所期望的。

- 未使用CHECK創建不重疊的分區,這使得計劃者無法知道每個分區內部的內容。有可能錯過這一步,但仍然可以正確地將數據放入正確的分區,規劃人員不會知道這一點。

- 未在每個分區上放置索引,只在主表上創建一個索引。這將使您在相關​​分區上進行順序掃描,因此不會像上述那樣糟糕,但也不是很好。

在即將發佈的PostgreSQL發行版中有一些工作可以讓這一切變得更容易(在8.4中設置constraint_partition是相當自動的,某些分區設置自動化正在工作)。現在,如果您仔細按照說明進行操作並避免所有這些問題,那麼它應該可以工作。