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-Tree | Bitmap |
|---|---|---|
| 基数 | 高 | 低 |
| 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. 最佳实践
- 低基数:适合
- 仓库:推荐
- OLTP:避免
- 多列:AND/OR
- 统计:收集
- 监控:使用
- 测试:性能
- 位图 JOIN:星型
- 文档:设计
- 演练:定期
16. 参考资料
[1] Oracle Database SQL Tuning Guide 19c, “Bitmap Indexes” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/