Oracle 索引聚簇因子与优化
Oracle 索引聚簇因子与优化
适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
聚簇因子(Clustering Factor, CF) 是索引关键统计[1]:
含义:
- 索引顺序与表数据物理顺序一致程度
- CF 接近块数:好
- CF 接近行数:差
2. 查看 CF
2.1 索引 CF
SELECT
index_name,
clustering_factor,
num_rows,
leaf_blocks,
blevel
FROM user_indexes
WHERE table_name = 'EMPLOYEES';
2.2 CF 评估
| CF | 评价 | 索引使用 |
|---|---|---|
| 接近块数 | 好 | 范围扫描快 |
| 接近行数 | 差 | 范围扫描慢 |
3. CF 影响
3.1 CBO 决策
- CF 差:CBO 倾向全表扫描
- CF 好:CBO 倾向索引扫描
3.2 示例
表:1000 块,100000 行
CF = 1000(好):索引扫描快
CF = 100000(差):索引扫描慢
4. 优化 CF
4.1 表重组
-- 按索引列排序
CREATE TABLE new_table
AS SELECT * FROM old_table ORDER BY indexed_col;
-- 重命名
DROP TABLE old_table;
RENAME new_table TO old_table;
4.2 索引组织表(IOT)
CREATE TABLE employees_iot (
id NUMBER PRIMARY KEY,
name VARCHAR2(100),
...
) ORGANIZATION INDEX;
4.3 表聚簇
CREATE CLUSTER emp_cluster (dept_id NUMBER);
CREATE INDEX idx_emp_cluster ON CLUSTER emp_cluster;
CREATE TABLE employees CLUSTER emp_cluster(dept_id) AS ...;
4.4 分区表
CREATE TABLE sales
PARTITION BY RANGE (sale_date) (...)
AS SELECT * FROM sales_old;
5. 索引重建
5.1 重建
ALTER INDEX idx_name REBUILD
TABLESPACE idx_tbs
ONLINE
PARALLEL 4;
5.2 重建不改善 CF
- CF 是数据分布属性
- 重建仅整理索引结构
6. 反向键索引
6.1 概述
- 反向存储键值
- 减少 Hot Block
- 不支持范围查询
6.2 创建
CREATE INDEX idx_emp_id_rev ON employees(id) REVERSE;
6.3 适用
- 序列生成 ID
- 等值查询
7. 函数索引
7.1 创建
CREATE INDEX idx_emp_upper ON employees(UPPER(name));
7.2 使用
SELECT * FROM employees WHERE UPPER(name) = 'SMITH';
8. 复合索引
8.1 列顺序
- 高选择性列前
- WHERE 频繁列前
- 范围列后
8.2 示例
CREATE INDEX idx_emp_dept_sal ON employees(dept_id, salary);
SELECT * FROM employees WHERE dept_id = 10 AND salary > 5000;
-- 索引使用最佳
9. 监控
9.1 索引使用
ALTER INDEX idx_name MONITORING USAGE;
-- ... 业务运行
SELECT * FROM v$object_usage;
ALTER INDEX idx_name NOMONITORING USAGE;
9.2 索引失效
SELECT owner, index_name, status
FROM dba_indexes
WHERE status != 'VALID';
9.3 索引碎片
ANALYZE INDEX idx_name VALIDATE STRUCTURE;
SELECT name, height, lf_rows, del_lf_rows FROM index_stats;
10. 索引选择
10.1 B-Tree
- 默认
- 高选择性
10.2 Bitmap
- 低选择性
- 数据仓库
- 不适合 OLTP
CREATE BITMAP INDEX idx_emp_gender ON employees(gender);
10.3 Bitmap Join
CREATE BITMAP INDEX idx_sales_cust ON sales(c.customer_city)
FROM sales s, customers c
WHERE s.cust_id = c.id;
详细见:Oracle 索引优化策略。
11. 常见坑与排错
11.1 索引未使用
-- 1. CF 差
-- 2. 统计信息
-- 3. HINT
-- 4. 函数阻止
WHERE UPPER(name) = 'SMITH' -- 普通索引不生效
11.2 索引失效
-- 1. DDL 操作
ALTER TABLE ... MOVE; -- 索引 UNUSABLE
-- 2. 重建
ALTER INDEX ... REBUILD ONLINE;
11.3 CF 差查询慢
-- 1. 表重组
-- 2. IOT
-- 3. 聚簇
-- 4. 分区
12. 最佳实践
- CF 监控:索引评估
- 高选择性索引:B-Tree
- 低选择性:Bitmap
- 复合索引列序:选择性
- 函数索引:函数查询
- IOT:主键表
- 表聚簇:JOIN 多表
- 分区:大表
- 监控使用率:删除无用
- 定期重建:碎片
13. 参考资料
[1] Oracle Database SQL Tuning Guide 19c, “Index Clustering Factor” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/index-clustering-factor.html