说明结果中的“重新检查条件”是什么意思?

时间:2018-06-21 03:09:50

标签: postgresql sql-execution-plan

来自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

谢谢。

2 个答案:

答案 0 :(得分:6)

邮件列表上的Tom Lane对此进行了解释:

  
    

“重新检查条件”是什么,为什么需要它?

  
     

如果位图太大,我们会将其转换为“有损”样式,其中   只记住哪些页面包含匹配的元组,而不记住   每个元组分别。发生这种情况时,就座表访问阶段   必须检查页面上的每个元组,然后重新检查扫描条件以   查看返回的元组。

答案 1 :(得分:4)

这可能是对并非总是执行的状况的重新检查。

仅当位图是有损EXPLAIN (ANALYZE)将指示)时,才执行重新检查。

如果work_mem的大小不足以包含每个表行包含一位的位图,则位图索引扫描将变得有损。然后它将降级为每8K页1位。来自此类块的行将必须重新检查。