2012-09-04 88 views
5

我正在測試不同的查詢,我很好奇數據庫如何決定使用位圖堆掃描和索引掃描。如何確定位圖堆掃描和索引掃描?

在客戶端創建索引customers_email_idx(電子郵件 varchar_pattern_ops);

正如你可以看到有一個客戶表(dellstore的例子),我添加一個索引到電子郵件列。

首先查詢是在這裏:

SELECT * FROM客戶那裏電子郵件像 'ITQ%@dell.com'; - >查詢 與索引掃描

解釋分析查詢是在這裏:

              QUERY PLAN                
--------------------------------------------------------------------------------------------------------------------------------- 
Index Scan using customers_email_idx on customers (cost=0.00..8.27 rows=2 width=268) (actual time=0.046..0.046 rows=0 loops=1) 
    Index Cond: (((email)::text ~>=~ 'ITQ'::text) AND ((email)::text ~<~ 'ITR'::text)) 
    Filter: ((email)::text ~~ 'ITQ%@dell.com 
'::text) 
Total runtime: 0.113 ms 

其他查詢是在這裏:

SELECT * FROM客戶那裏電子郵件像「IT%@ dell.com「; - >查詢 與位圖堆掃描

解釋分析查詢是在這裏:

              QUERY PLAN               
------------------------------------------------------------------------------------------------------------------------------ 
Bitmap Heap Scan on customers (cost=4.54..106.77 rows=2 width=268) (actual time=0.206..0.206 rows=0 loops=1) 
    Filter: ((email)::text ~~ 'IT%@dell.com 
'::text) 
    -> Bitmap Index Scan on customers_email_idx (cost=0.00..4.54 rows=29 width=0) (actual time=0.084..0.084 rows=28 loops=1) 
     Index Cond: (((email)::text ~>=~ 'IT'::text) AND ((email)::text ~<~ 'IU'::text)) 
Total runtime: 0.273 ms 

你能解釋一下這個例子,爲什麼Bitmap和索引掃描用在這裏?

謝謝..

+1

查看@ araqnid的答案和這個:http ://wiki.postgresql.org/images/4/45/Explaining_EXPLAIN.pdf 尋找'索引掃描'。關鍵可能是'優化器可以選擇它[位圖掃描]用於低選擇性的任何可索引掃描「 – dezso

+1

我認爲這個問題很適合dba.SE。 –

回答

6

表中共有多少行?該決定基於索引掃描將輸出的行數比例。

如果要訪問足夠高比例的表,將使用位圖索引掃描以確保儘可能多的磁盤訪問是順序的。相比之下,普通索引掃描對錶格數據每次一頁隨機訪問。 (並且如果預計要訪問的表的比例足夠高,則根本不使用該索引,並且依次加載整個表數據)

一個問題是投影表中的多少行將被訪問只是一個估計。但是,正如你可以想象的那樣,'IT%'很可能比'ITQ%'匹配得多(請記住,後綴不是索引掃描的一部分,只有最後一個過濾器)

+0

總行數:20.000 - 通過索引掃描找到的行:5 - 通過位圖找到的行:6 – TraviJuu