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

  1. CF 监控:索引评估
  2. 高选择性索引:B-Tree
  3. 低选择性:Bitmap
  4. 复合索引列序:选择性
  5. 函数索引:函数查询
  6. IOT:主键表
  7. 表聚簇:JOIN 多表
  8. 分区:大表
  9. 监控使用率:删除无用
  10. 定期重建:碎片

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