在解释命令的输出中,我找到了两个术语'Seq Scan'和'Bitmap heap Scan'。有人能告诉我这两种扫描有什么区别吗? (我使用PostgreSQL)postgres中的Seq扫描和位图堆扫描有什么区别?
41
A
回答
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)
我们可以看这是:
- 构建我们希望a = 4的行的位图。 (位图索引扫描)
- 构建我们想要的a = 3的位图。 (位图索引扫描)
- 或者两个位图一起(BitmapOr)
- 看那些行了在该表(位图堆扫描),并检查,以确保一个= 4或= 3(复检COND)
[是,这些查询计划是愚蠢的,但那是因为我们没有分析test
如果我们分析它,他们全是顺序扫描,因为有5个微小行]
+1
或者位图扫描也可以是索引扫描的子集。 – WolfmanDragon 2010-01-04 16:51:56
相关问题
- 1. greenplum中的表扫描和seq扫描有什么区别
- 2. 表扫描和聚簇索引扫描有什么区别?
- 3. 主动扫描和被动扫描有什么区别?
- 4. Postgres缓慢的位图堆扫描
- 5. 什么是PNO的区别扫描和WLAN预设扫描?
- 6. Postgres:加速位图堆扫描?
- 7. 一次扫描(扫描)和两次扫描(扫描)之间的区别
- 8. 如何确定位图堆扫描和索引扫描?
- 9. 索引扫描,表扫描和索引查找有什么区别?
- 10. 在Hbase中,ResultScanner和initTableMapperJob之间的扫描有什么区别
- 11. postgres如何决定是使用索引扫描还是seq扫描?
- 12. SELECT DISTINCT,摆脱位图堆的扫描
- 13. 什么是查询计划中的“位图堆扫描”?
- 14. 解析器和扫描仪有什么区别?
- 15. Ruby字符串扫描和匹配有什么区别
- 16. 了解postgres解释瓦特/位图堆/索引扫描
- 17. 扫描,扫描仪类
- 18. GIN索引有什么问题,无法避免SEQ扫描?
- 19. 位图扫描0,跨越
- 20. Eclipse插件扫描器和分区扫描器
- 21. 执行seq扫描的Postgres查询优化
- 22. 为什么QO选择聚簇索引扫描与表扫描?
- 23. Seq Scan在桌上扫描的原因是什么?
- 24. 范围扫描vs唯一扫描vs跳过扫描
- 25. Multipage WIA扫描(docfeeder)扫描1页并阻止扫描器
- 26. 扫描仪不扫描我的输入
- 27. 扫描仪内的扫描仪错误
- 28. 扫描20次的Wifi扫描仪
- 29. 如何识别扫描标签的条码扫描器?
- 30. java扫描仪和图案
简单地说,“以次扫描“不使用索引(通常较慢),并且所有其他扫描尝试使用表中定义的索引。 – Gnudiff 2009-01-04 08:33:59