【问题标题】:What does "Recheck Cond" in Explain result mean?解释结果中的“重新检查条件”是什么意思?
【发布时间】:2018-11-30 06:30:59
【问题描述】:

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

我说对了吗

  • 首先对第一个条件的所有行执行位图索引扫描,然后

  • 那么在返回的行上,针对第二个条件执行Bitmap Heap Scan?

既然 Bitmap Index Scan 已经在 unique1

我不确定我是否理解此相关帖子https://dba.stackexchange.com/questions/106264/recheck-cond-line-in-query-plans-with-a-bitmap-index-scan

谢谢。

【问题讨论】:

    标签: postgresql sql-execution-plan


    【解决方案1】:

    这是由邮件列表中的Tom Lane 解释的:

    什么是“复查条件”,为什么需要它?

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

    【讨论】:

    【解决方案2】:

    这是对并不总是执行的条件的潜在重新检查。

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

    如果work_mem 不够大,无法包含每个表行包含一位的位图,则位图索引扫描会变得有损。然后它将降级为每 8K 页一位。必须重新检查这些块中的行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 2018-03-05
      相关资源
      最近更新 更多