来自PostgreSQL文档中的一个示例:
EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND stringu1 = 'xxx';
QUERY PLAN
------------------------------------------------------------------------------
Bitmap Heap Scan on tenk1 (cost=5.04..229.43 rows=1 width=244)
Recheck Cond: (unique1 < 100)
Filter: (stringu1 = 'xxx'::name)
-> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.04 rows=101
width=0)
Index Cond: (unique1 < 100)
我纠正了
首先针对所有第一个条件对所有行执行位图索引扫描,然后
然后在返回的行上,对第二种情况执行位图堆扫描?
由于位图索引扫描已在unique1 <100上检查索引条件,为什么在Bitmp堆扫描中再次在相同条件下出现“重新检查条件”? “重新检查条件”是什么意思?
我不确定我是否了解此相关帖子https://dba.stackexchange.com/questions/106264/recheck-cond-line-in-query-plans-with-a-bitmap-index-scan
谢谢。
答案 0 :(得分:6)
邮件列表上的Tom Lane对此进行了解释:
“重新检查条件”是什么,为什么需要它?
如果位图太大,我们会将其转换为“有损”样式,其中 只记住哪些页面包含匹配的元组,而不记住 每个元组分别。发生这种情况时,就座表访问阶段 必须检查页面上的每个元组,然后重新检查扫描条件以 查看返回的元组。
答案 1 :(得分:4)
这可能是对并非总是执行的状况的重新检查。
仅当位图是有损(EXPLAIN (ANALYZE)
将指示)时,才执行重新检查。
如果work_mem
的大小不足以包含每个表行包含一位的位图,则位图索引扫描将变得有损。然后它将降级为每8K页1位。来自此类块的行将必须重新检查。