0

0

postgresqlbitmapscan如何工作_postgresql位图扫描原理

舞夢輝影

舞夢輝影

发布时间:2025-11-22 20:34:02

|

799人浏览过

|

来源于php中文网

原创

BitmapScan通过位图合并多索引结果,先生成标记数据页的位图,再按顺序读取,减少随机I/O,适用于多条件查询。

postgresqlbitmapscan如何工作_postgresql位图扫描原理

BitmapScan 是 PostgreSQL 中一种重要的索引扫描方式,它在多条件查询或多个索引结果需要合并时发挥关键作用。不同于直接通过索引获取元组的 Index Scan,BitmapScan 先构建一个“位图”来记录可能满足条件的数据页位置,再统一读取这些数据页中的行。

什么是 BitmapScan

BitmapScan 的核心是使用一个位图(bitmap)结构来标记哪些数据页包含符合条件的行。这个过程分为两个阶段:

  • 位图生成阶段:通过索引扫描(如 B-tree、GiST、GIN 等),找出所有可能匹配查询条件的页面号,并将这些页面号记录到位图中。
  • 位图扫描阶段:PostgreSQL 按照位图中标记的页面顺序,从表中读取实际的数据行,并进行可见性检查(Visibility Check)以确认是否真正满足条件(比如事务可见性)。

这种机制避免了随机 I/O 过多的问题,因为它是先收集所有目标页面,然后按物理存储顺序读取,提升磁盘访问效率。

位图扫描的工作流程

当执行一条带有 WHERE 条件且可利用索引的查询时,如果优化器判断使用 BitmapScan 更高效(尤其是涉及多个索引的 AND/OR 操作),就会采用如下流程:

  • 使用一个或多个索引生成对应的位图。例如,对字段 A 和 B 分别做索引查找,各自产生一个位图。
  • 对多个位图进行逻辑运算(AND、OR),合并成一个新的位图。比如“A=1 AND B=2”,会将两个索引产生的位图做交集。
  • 根据最终的位图,按页面编号排序后批量读取表数据块。
  • 在每个命中页面中,检查具体行是否满足条件并符合事务可见性(即未被删除或对当前事务可见)。

这种方式特别适合范围查询或多条件组合查询,能有效减少重复的随机访问。

BitmapScan 的优势与适用场景

相比普通 Index Scan,BitmapScan 在以下情况更具优势:

Magician
Magician

Figma插件,AI生成图标、图片和UX文案

下载
  • 减少随机 I/O:Index Scan 可能导致每行都去不同页面读取,造成大量随机访问;而 BitmapScan 将页面集中排序后再读取,更接近顺序 I/O。
  • 支持多索引组合:通过 BitmapAnd / BitmapOr 节点实现多个索引结果的合并,适用于复合查询条件。
  • 内存使用可控:位图只记录页面号和页内行偏移,占用空间较小,即使面对大量匹配行也能高效处理。

常见触发场景包括:

  • 查询中有多个 WHERE 条件,每个都有独立索引。
  • 使用 OR 连接的条件(需配合索引合并)。
  • 大范围扫描但返回数据量适中。

查看是否使用了 BitmapScan

通过 EXPLAIN 可以观察执行计划中是否出现 BitmapScan:

EXPLAIN SELECT * FROM users WHERE age = 25 AND city = 'Beijing';

输出可能包含:

Bitmap Heap Scan on users -> Bitmap Index Scan on idx_users_age -> Bitmap Index Scan on idx_users_city

这表示先用两个索引分别生成位图,然后合并,最后进行堆表扫描。

基本上就这些。理解 BitmapScan 有助于优化查询设计和索引策略,特别是在复杂查询中合理利用索引组合提升性能。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

387

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

571

2023.08.10

postgresql常用命令
postgresql常用命令

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。本专题为大家提供postgresql相关的文章、下载、课程内容,供大家免费下载体验。

158

2023.10.10

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

970

2023.11.02

postgresql常用命令有哪些
postgresql常用命令有哪些

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。更详细的postgresql常用命令,大家可以访问下面的文章。

195

2023.11.16

postgresql常用命令介绍
postgresql常用命令介绍

postgresql常用命令有l、d、d5、di、ds、dv、df、dn、db、dg、dp、c、pset、show search_path、ALTER TABLE、INSERT INTO、UPDATE、DELETE FROM、SELECT等。想了解更多postgresql的相关内容,可以阅读本专题下面的文章。

267

2023.11.20

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

16

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

34

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号