Oracle 索引聚簇因子详解
Oracle 索引聚簇因子详解
适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
索引聚簇因子(Clustering Factor)衡量索引与表的有序度[1]:
详细见:Oracle 索引聚簇因子与优化、Oracle 索引优化策略。
2. 概念
2.1 定义
- 索引顺序与表行物理顺序一致性
- 低:索引有序,表也有序
- 高:索引有序,表乱
2.2 范围
- 接近块数:低 CF,好
- 接近行数:高 CF,差
3. 查看
3.1 视图
SELECT index_name, clustering_factor, num_rows, leaf_blocks
FROM user_indexes
WHERE table_name = 'EMP';
3.2 解释
- CF 接近表块数:索引有序
- CF 接近行数:索引无序
4. 影响
4.1 执行计划
- 低 CF:索引访问好
- 高 CF:全表扫描可能更好
4.2 单块读
- 索引访问 + 表回表
- 每 ROWID 一次单块读
- CF 高:单块读多
4.3 性能
- 低 CF:性能好
- 高 CF:性能差
5. 优化
5.1 表重组
-- 按索引列排序
ALTER TABLE emp MOVE ORDER BY emp_id;
-- 重建索引
ALTER INDEX idx_emp REBUILD;
5.2 IOT
-- 索引组织表
CREATE TABLE emp (
id NUMBER PRIMARY KEY,
name VARCHAR2(100)
) ORGANIZATION INDEX;
5.3 聚簇表
CREATE CLUSTER emp_cluster (dept_id NUMBER);
CREATE INDEX idx_cluster ON CLUSTER emp_cluster;
CREATE TABLE emp CLUSTER emp_cluster (dept_id) AS ...;
5.4 Hash 聚簇
CREATE CLUSTER emp_cluster (dept_id NUMBER)
HASHKEYS 100;
6. 索引选择
6.1 多索引
- 不同索引不同 CF
- 优化器选择
- 测试
6.2 复合索引
- 列顺序
- CF 影响
7. 统计
7.1 收集
EXEC DBMS_STATS.GATHER_INDEX_STATS('SCOTT', 'IDX_EMP');
EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT', 'EMP', cascade => TRUE);
7.2 手动设置
EXEC DBMS_STATS.SET_INDEX_STATS(
ownname => 'SCOTT',
indname => 'IDX_EMP',
clstfct => 1000
);
8. 应用场景
8.1 OLTP
- 索引访问多
- 低 CF 重要
- 性能
8.2 报表
- 范围扫描
- CF 影响
- 优化
8.3 大表
- 大表索引
- CF 关键
- 优化
9. 与其他指标
9.1 选择性
- 高选择性 + 低 CF:索引最好
- 低选择性 + 低 CF:可索引
- 高 CF:全表扫描
9.2 基数
- 基数
- 选择性
- CF
- 综合
10. 监控
10.1 CF 趋势
SELECT index_name, clustering_factor, last_analyzed
FROM user_indexes
ORDER BY clustering_factor DESC;
10.2 执行计划
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('&sql_id'));
10.3 性能
SELECT sql_id, executions, buffer_gets
FROM v$sql
ORDER BY buffer_gets DESC;
11. 常见问题
11.1 CF 高
- 表无序
- 重组
- IOT
11.2 索引不使用
- CF 高
- 全表扫描
- 优化
11.3 统计旧
- 重新收集
- 准确
12. 最佳实践
- 低 CF:目标
- 表重组:排序
- IOT:主键访问
- 聚簇:相关表
- 统计:准确
- 测试:性能
- 监控:CF
- 复合索引:列顺序
- 文档:设计
- 演练:定期
13. 参考资料
[1] Oracle Database SQL Tuning Guide 19c, “Clustering Factor” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/