Postgres 14创建覆盖索引后查询仍出现Bitmap Heap Scan原因咨询
执行计划不一致的具体原因
- 可见性映射表(Visibility Map, VM)未更新:PostgreSQL 要触发*仅索引扫描(Index Only Scan)*实现0堆读取的核心前提是,查询涉及的所有数据页在可见性映射表中被标记为「对所有事务可见」,不需要回表校验行的可见性。刚导入的pagila示例库如果没有执行过
VACUUM film;操作,可见性映射表没有生成对应数据块的可见标记,优化器就不会选择仅索引扫描,转而使用Bitmap扫描路径。 - 优化器成本评估差异:如果你的查询命中的行数多于课程示例的命中行数,优化器会评估认为Bitmap扫描的随机IO成本比仅索引扫描更低,就会优先选择Bitmap Heap Scan路径。你可以执行
EXPLAIN ANALYSE VERBOSE查看两种执行路径的cost估算值验证该判断。 - 统计信息过时:如果
film表的统计信息长期未更新,优化器对扫描行数、IO成本的估算会出现偏差,也会导致执行计划选择错误,你可以先执行ANALYZE film;更新表统计信息后再重新执行查询测试。 - 你也可以手动临时关闭Bitmap扫描验证:执行
SET enable_bitmapscan = off;后重新运行查询,如果此时执行计划切换为仅索引扫描且heap fetches为0,就可以确认是优化器成本评估优先级的问题。
内容的提问来源于stack exchange,提问作者welschii
相关产品推荐
相关产品推荐

