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

相关问题