41

在解釋命令的輸出中,我找到了兩個術語'Seq Scan'和'Bitmap heap Scan'。有人能告訴我這兩種掃描有什麼區別嗎? (我使用PostgreSQL)postgres中的Seq掃描和位圖堆掃描有什麼區別?

+2

簡單地說,「以次掃描「不使用索引(通常較慢),並且所有其他掃描嘗試使用表中定義的索引。 – Gnudiff 2009-01-04 08:33:59

回答

65

http://www.postgresql.org/docs/8.2/static/using-explain.html

基本上,按順序進行掃描是要實際行,並開始從第1行讀取,並繼續下去,直到查詢被滿足(這可能不是整個表,例如,在限制的情況下)

位圖堆掃描意味着PostgreSQL已經找到了一小部分要讀取的行(例如,從索引),並且將僅獲取那些行。這當然會有更多的搜索,所以只有當它需要一小部分行時才更快。

拿一個例子:

create table test (a int primary key, b int unique, c int); 
insert into test values (1,1,1), (2,2,2), (3,3,3), (4,4,4), (5,5,5); 

現在,我們可以很容易地得到一個序列掃描:

explain select * from test where a != 4 

         QUERY PLAN       
--------------------------------------------------------- 
Seq Scan on test (cost=0.00..34.25 rows=1930 width=12) 
    Filter: (a <> 4) 

它沒有按順序進行掃描,因爲它估計它要搶在絕大多數的表;試圖做到這一點(而不是一個大的,不尋常的閱讀)將是愚蠢的。現在

,我們可以使用索引:

explain select * from test where a = 4 ; 
           QUERY PLAN        
---------------------------------------------------------------------- 
Index Scan using test_pkey on test (cost=0.00..8.27 rows=1 width=4) 
    Index Cond: (a = 4) 

最後,我們可以得到一些位圖操作:

explain select * from test where a = 4 or a = 3; 
            QUERY PLAN         
------------------------------------------------------------------------------ 
Bitmap Heap Scan on test (cost=8.52..13.86 rows=2 width=12) 
    Recheck Cond: ((a = 4) OR (a = 3)) 
    -> BitmapOr (cost=8.52..8.52 rows=2 width=0) 
     -> Bitmap Index Scan on test_pkey (cost=0.00..4.26 rows=1 width=0) 
       Index Cond: (a = 4) 
     -> Bitmap Index Scan on test_pkey (cost=0.00..4.26 rows=1 width=0) 
       Index Cond: (a = 3) 

我們可以看這是:

  1. 構建我們希望a = 4的行的位圖。 (位圖索引掃描)
  2. 構建我們想要的a = 3的位圖。 (位圖索引掃描)
  3. 或者兩個位圖一起(BitmapOr)
  4. 看那些行了在該表(位圖堆掃描),並檢查,以確保一個= 4或= 3(複檢COND)

[是,這些查詢計劃是愚蠢的,但那是因爲我們沒有分析test如果我們分析它,他們全是順序掃描,因爲有5個微小行]

+1

或者位圖掃描也可以是索引掃描的子集。 – WolfmanDragon 2010-01-04 16:51:56