seq扫描和postgres中的位图堆扫描有什么区别?

在解释命令的输出中,我find了两个术语'Seq Scan'和'Bitmap heap Scan'。 有人能告诉我这两种扫描有什么区别? (我正在使用PostgreSql)

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

基本上,顺序扫描将进入实际的行,并从第1行开始读取,并继续,直到查询得到满足(这可能不是整个表,例如在限制的情况下)

位图堆扫描意味着PostgreSQL已经find了一小部分要读取的行(例如,从一个索引),并且将只提取那些行。 这当然会有更多的寻求,所以只有当它需要一小部分行时才更快。

举个例子:

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); 

现在,我们可以很容易地得到一个seq扫描:

 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. build立我们想要的= 4的行的位图。 (位图索引扫描)
  2. 构build我们想要的a = 3的位图。 (位图索引扫描)
  3. 或者将两个位图放在一起(BitmapOr)
  4. 查看表格中的那些行(位图堆扫描)并检查以确保a = 4或a = 3(重新检查cond)

[是的,这些查询计划是愚蠢的,但那是因为我们没有分析test如果我们分析了它们,它们都是顺序扫描,因为有5个小行]