postgresql - bitmap index scan & bitmap heap scan

4 阅读4分钟

1. Bitmap Index Scan

Bitmap Index Scan 是一种扫描索引的方法,主要用于快速查找符合某些条件的记录。在这种扫描中,数据库会创建一个位图(bitmap),每个位表示一个数据行。位图中的每个“1”表示该行符合查询条件,而“0”表示不符合条件。

  • 作用:它通过扫描索引中的相关条目,构造一个位图,记录哪些数据行符合查询条件。
  • 优点:这种方法特别适用于当查询条件包括多个列或者包含多个值时,可以非常高效地组合多个索引。
  • 应用场景:通常适用于涉及多个条件组合的复杂查询,或者适用于低基数(distinct value较少)列的查询。例如,查询某些状态、类别等。

2. Bitmap Heap Scan

Bitmap Heap Scan 是基于 Bitmap Index Scan 的扫描方式。在 Bitmap Index Scan 构造了位图之后,Bitmap Heap Scan 会使用这个位图来访问实际的表数据,提取符合条件的记录。

  • 作用:它通过位图标记来直接访问堆(表)的数据行,不需要重新扫描索引。
  • 优点:与传统的顺序扫描(sequential scan)相比,Bitmap Heap Scan 可以减少不必要的数据读取,因为它只访问满足条件的行。
  • 应用场景:适用于需要高效读取大量不连续数据的场景,尤其是当查询涉及多个复杂条件时,可以显著提高查询效率。

它们的配合使用:

这两种扫描方式通常是联合使用的。例如,假设有一个查询需要在两个不同的列上应用条件:

  1. 数据库首先对每个条件分别执行 Bitmap Index Scan,生成多个位图。
  2. 然后,使用 Bitmap Heap Scan 来根据这些位图访问实际的数据行,筛选出符合所有条件的记录。

总结

  • Bitmap Index Scan 是用来构建符合条件的位图的,它关注于如何通过索引快速筛选记录。
  • Bitmap Heap Scan 是通过这些位图来直接从堆表中获取实际的数据行,完成查询。

举个例子,更好地理解如何在 Bitmap Index ScanBitmap Heap Scan 中工作。

示例:查询某个表中的特定数据

假设我们有一个简单的表 employees,它包含以下列:

  • id (员工ID)
  • department (部门)
  • salary (薪资)
CREATE TABLE employees (
    id INT,
    department VARCHAR,
    salary INT
);

并且表中有如下数据:

iddepartmentsalary
1HR4000
2IT6000
3HR5000
4Marketing7000
5IT5500
6Marketing7500
7HR4500
8IT6500

查询:查找所有 HR 部门中薪资大于 4500 的员工

我们需要查询 department = 'HR'salary > 4500 的所有员工。

查询语句:

SELECT * FROM employees
WHERE department = 'HR' AND salary > 4500;

Bitmap Index Scan 和 Bitmap Heap Scan 发生的过程:

  1. Bitmap Index Scan

    • 数据库首先会对 departmentsalary 列分别使用索引扫描(假设这两列有索引),来查找符合条件的记录。

    1.1 Department Index Scan

    • 假设我们有一个索引在 department 列上,Bitmap Index Scan 会扫描该索引,找到所有 department = 'HR' 的记录。结果会是:
    位图:1 0 1 0 0 0 1 0
    

    这里的位图表示:1 表示对应的行符合 department = 'HR' 条件,0 表示不符合。

    1.2 Salary Index Scan

    • 接着,数据库会对 salary 列上的索引进行扫描,找到所有 salary > 4500 的记录。假设结果是:
    位图:0 0 1 1 0 1 1 1
    

    这表示哪些记录的 salary 大于 4500。

  2. Bitmap OR 操作

    • 然后,数据库会将这两个位图进行 按位与(AND) 操作,得到符合两个条件的最终位图:
    位图:0 0 1 0 0 0 1 0
    

    这个位图表示,符合 department = 'HR'salary > 4500 条件的记录是第 3 和第 7 行。

  3. Bitmap Heap Scan

    • 最后,数据库通过 Bitmap Heap Scan 根据上述位图访问实际的表数据。只访问符合条件的记录,即第 3 和第 7 行。这就减少了不必要的数据读取,显著提高了查询效率。

总结

在这个过程中,Bitmap Index Scan 首先使用索引生成位图,找到符合条件的记录位置。然后通过 Bitmap Heap Scan 根据位图直接访问实际数据行,最终输出符合查询条件的结果。

希望这个例子能帮你更好地理解如何在 Bitmap 中查找数据!