定义

  目前一般我们使用的索引都是 B-Tree 索引,索引结构中存储的是键值和对应 ROWID。位图索引是指用位图表示的索引,通常创建在有大量重复值的列上,针对每个键值建立不同的位图。索引结构中主要存储键值、起止 ROWID 和位置编码,位置编码中的每一位表示键值对应数据行的有无,一个块可能指向多行数据的位置。
位图索引结果图

  • 位图索引通过位图向量,表示索引键值在表中的分布
  • 存在大量更新操作的列上不宜建位图索引,因为更新向量时相应键值涉及到的数据行都将被锁定

与 B-Tree 索引的区别

  1. 位图索引一个键值对应一个叶子节点,B-Tree 索引一个叶子节点包含多个索引键值
  2. 位图索引使用位图向量标识键值对应数据行的分布,B-Tree 采用 Row_id 定位数据行
  3. 位图索引创建不需要排序,B-Tree 索引需要排序
  4. 位图索引允许键值为 Null,B-Tree 索引对 Null 值敏感
  5. 位图索引可以进行位运算(and、or)

位图索引优缺点

优点

  • 位图索引由于只存储键值的起止 Rowid 和位图,占用的空间非常少.
  • 位图索引创建时不需要排序,创建速度快
  • 位图索引对 Null 值不敏感
  • 位图运算使相应查询更快
  • 可以通过位图索引直接计数。

缺点

  • 不适合选择度底的列
  • 频繁的 DML 可能会导致性能问题,更新索引会产生行锁(可能锁定多行)
  • 可能会溢出,索引数据块难于放下整个索引值,这导致低效。

位图索引相关执行计划

  • 位图索引单键值扫描(BITMAP INDEX SINGLE VALUE)
  • 位图索引范围扫描(BITMAP INDEX RANGE SCAN)
  • 位图索引全扫描(BITMAP INDEX FULL SCAN)
  • 位图索引快速全扫描(BITMAP INDEX FAST FULL SCAN)
  • 位图按位与(BITMAP AND)
  • 位图按位或(BITMAP OR)
  • 位图按位减(BITMAP MINUS)