Oracle 位图索引详解

Oracle 位图索引详解

适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

位图索引(Bitmap Index)适合低基数列[1]:

详细见:Oracle 索引优化策略


2. 特性

2.1 适用

- 低基数列(性别、状态等)
- 数据仓库
- 很少 DML

2.2 优势

- 空间小
- 多列 AND/OR 高效
- COUNT 快

2.3 劣势

- 高基数列不适合
- DML 开销大
- 锁级别

3. 创建

3.1 基本

CREATE BITMAP INDEX idx_gender ON employees (gender);
CREATE BITMAP INDEX idx_status ON orders (status);

3.2 复合

CREATE BITMAP INDEX idx_complex ON sales (region, product_category);

4. 使用

4.1 等值

SELECT * FROM employees WHERE gender = 'M';
-- 使用位图索引

4.2 多列 AND

SELECT * FROM sales 
WHERE region = 'NORTH' AND product_category = 'ELECTRONICS';
-- 位图 AND 操作

4.3 COUNT

SELECT COUNT(*) FROM sales WHERE region = 'NORTH';
-- 位图快速计数

5. 原理

5.1 位图

- 每个值一个位图
- 1:行匹配
- 0:不匹配

5.2 操作

- AND:位与
- OR:位或
- NOT:位反
- 快速

6. 适用场景

6.1 低基数

- 性别(2)
- 状态(5)
- 地区(10)
- 类型

6.2 数据仓库

- 星型模式
- 多维分析
- 快速聚合

6.3 静态

- 很少 DML
- 主要查询
- 历史

7. 不适用

7.1 高基数

- ID
- 姓名
- 日期
- 唯一值

7.2 OLTP

- DML 频繁
- 锁开销
- 不适合

8. 与 B-Tree 对比

B-TreeBitmap
基数
DML
空间
AND/OR一般
OLTP适合不适合
仓库一般适合

9. 位图连接索引

9.1 创建

CREATE BITMAP INDEX idx_bm_join 
ON sales (departments.dept_name)
FROM sales, departments
WHERE sales.dept_id = departments.id;

9.2 优势

- 星型模式
- JOIN 优化
- 仓库

10. 统计

EXEC DBMS_STATS.GATHER_INDEX_STATS('SCOTT', 'IDX_GENDER');

11. 查看

11.1 视图

SELECT index_name, index_type, clustering_factor, leaf_blocks
FROM user_indexes
WHERE index_type = 'BITMAP';

11.2 使用

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('&sql_id'));
-- BITMAP CONVERSION
-- BITMAP AND
-- BITMAP OR

12. 性能

12.1 优势

- 多列组合快
- 空间小
- COUNT 快

12.2 DML

- 锁段
- 阻塞
- 开销

13. 监控

13.1 使用

ALTER INDEX idx_gender MONITORING USAGE;
SELECT * FROM v$object_usage;

13.2 性能

SELECT sql_id, executions, buffer_gets
FROM v$sql
ORDER BY buffer_gets DESC;

14. 常见问题

14.1 ORA-08102

- 位图索引问题
- 重建

14.2 DML 慢

- 位图索引
- 锁
- 评估

14.3 高基数

- 不适合
- B-Tree

15. 最佳实践

  1. 低基数:适合
  2. 仓库:推荐
  3. OLTP:避免
  4. 多列:AND/OR
  5. 统计:收集
  6. 监控:使用
  7. 测试:性能
  8. 位图 JOIN:星型
  9. 文档:设计
  10. 演练:定期

16. 参考资料

[1] Oracle Database SQL Tuning Guide 19c, “Bitmap Indexes” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/