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. 最佳实践

  1. 低 CF:目标
  2. 表重组:排序
  3. IOT:主键访问
  4. 聚簇:相关表
  5. 统计:准确
  6. 测试:性能
  7. 监控:CF
  8. 复合索引:列顺序
  9. 文档:设计
  10. 演练:定期

13. 参考资料

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