2011-03-18 44 views
0

鑑於表SELECT DISTINCT,擺脫位圖堆的掃描

create table a (x int, y int); 
create index a_x_y on a(x, y); 

我希望像select distinct x from a where y = 1查詢僅使用索引,而是使用索引由Y篩選,然後做了位圖堆掃描以獲得x的所有值。

--------------------------------------------------------------------------------------------------------------------- 
HashAggregate (cost=15.03..15.05 rows=2 width=4) (actual time=0.131..0.131 rows=0 loops=1) 
    -> Bitmap Heap Scan on a (cost=4.34..15.01 rows=11 width=4) (actual time=0.129..0.129 rows=0 loops=1) 
     Recheck Cond: (y = 1) 
     -> Bitmap Index Scan on a_x_y (cost=0.00..4.33 rows=11 width=0) (actual time=0.125..0.125 rows=0 loops=1) 
       Index Cond: (y = 1) 

將需要這種類型的查詢什麼樣的指標?

+0

請張貼真實計劃,而不是空表計劃。我們至少需要知道您有多少行,返回了多少行以及需要多少時間。 – Tometzky 2011-03-18 22:10:19

回答

1

位圖堆掃描需要0.129毫秒,是不是夠快?

如果你正在考慮「僅索引掃描」,PostgreSQL還不能做到這一點。

+0

它在我用作示例的空表上很快。 :) – ibz 2011-03-18 11:25:06

+0

是的,我只想索引掃描。我基本上需要所有不同的值,一個索引應該足以實現這一點。 – ibz 2011-03-18 11:26:21

+0

正如我所說:這是PostgreSQL不可能的 – 2011-03-18 11:29:21

3

由於您正在過濾索引的第二列,因此它不會用於直接索引掃描。如果您將索引更改爲y,x而不是x,y,它可能會爲您提供正在查找的掃描。

此外,如果將實際數據放入表中,您可能會得到不同的查詢計劃,因此您應該使用實際數據進行測試。

最後,我認爲你誤解了位圖掃描節點。位圖堆掃描並不意味着它正在進行實際的堆掃描。它使用索引來找出哪些頁面上有有趣的行,然後在第二個操作中僅在表中掃描這些頁面。

+0

1)我嘗試了兩種方法 - x,y和y,x。 2)我用大量數據在我的實際桌面上測試過。碰巧這個空的示例表具有相同的查詢計劃,所以爲了簡單起見,我發佈了這個表。抱歉混淆。 3)儘管如此,查詢非常慢(我需要多次運行它)。我希望我能以某種方式使用這個索引。 – ibz 2011-03-18 18:08:06

+1

y,x至少在理論上應該是可用的,所以很可能由於某種原因它認爲它太昂貴了。除非你使用的是舊版本的PostgreSQL,當然你應該升級:-)雖然跨列相關仍然存在一些問題,但是如果沒有更多細節,很難評論。您可能想將您的情況發佈到pgsql-performance郵件列表 - 但在這種情況下,請將您的* real * query/db組合的EXPLAIN ANALYZE輸出包含在內。 – 2011-03-18 18:43:39