Oracle 索引重建详解

Oracle 索引重建详解

适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

索引重建维护索引性能[1]:

详细见:Oracle 索引优化策略


2. 重建场景

2.1 碎片

- 大量删除
- 索引碎片
- 空间浪费
- 性能下降

2.2 高度

- B-Tree 高度 > 3
- 性能下降
- 重建降低高度

2.3 损坏

- 索引损坏
- ORA-600
- 重建修复

2.4 存储变更

- 表空间迁移
- 存储优化

3. ANALYZE

3.1 验证结构

ANALYZE INDEX idx_emp VALIDATE STRUCTURE;

3.2 查看

SELECT name, height, lf_rows, del_lf_rows, 
       ROUND(del_lf_rows/lf_rows*100, 2) AS del_pct
FROM index_stats;

3.3 判断

- del_pct > 20%:重建
- height > 3:重建

4. 重建

4.1 REBUILD

ALTER INDEX idx_emp REBUILD;
ALTER INDEX idx_emp REBUILD ONLINE;
ALTER INDEX idx_emp REBUILD TABLESPACE idx_ts;

4.2 在线

- ONLINE:允许 DML
- 12c+ 完全在线
- 锁少

4.3 并行

ALTER INDEX idx_emp REBUILD PARALLEL 4 ONLINE;
ALTER INDEX idx_emp NOPARALLEL;

5. COALESCE

5.1 合并

ALTER INDEX idx_emp COALESCE;

5.2 vs REBUILD

COALESCEREBUILD
ONLINE 无
空间不释放释放
速度
效果合并完全重建

5.3 适用

- 轻度碎片
- 快速
- 不能 ONLINE 重建

6. SHRINK SPACE

ALTER INDEX idx_emp SHRINK SPACE;
ALTER INDEX idx_emp SHRINK SPACE COMPACT;

7. 监控

7.1 索引使用

ALTER INDEX idx_emp MONITORING USAGE;
-- 一段时间后
SELECT * FROM v$object_usage;
ALTER INDEX idx_emp NOMONITORING USAGE;

7.2 统计

EXEC DBMS_STATS.GATHER_INDEX_STATS('SCOTT', 'IDX_EMP');

7.3 碎片

SELECT index_name, leaf_blocks, num_rows, 
       blevel, status
FROM user_indexes
WHERE table_name = 'EMP';

8. 调度

-- 自动
BEGIN
  DBMS_SCHEDULER.CREATE_JOB(
    job_name => 'rebuild_indexes',
    job_type => 'PLSQL_BLOCK',
    job_action => 'BEGIN rebuild_index_pkg.run; END;',
    repeat_interval => 'FREQ=WEEKLY; BYDAY=SUN',
    enabled => TRUE
  );
END;
/

9. 应用场景

9.1 维护

- 定期重建
- 碎片整理
- 性能保持

9.2 大量 DML

- 大量 INSERT/DELETE
- 碎片
- 重建

9.3 表迁移

- 表空间变更
- 索引迁移
- 重建

10. 性能

10.1 重建时间

- 索引大小
- 并行
- 在线

10.2 影响

- REBUILD:锁
- ONLINE:轻锁
- COALESCE:锁

11. 常见问题

11.1 ORA-08104

- 索引正在重建
- 等待

11.2 失败

- 空间不足
- 死锁
- 重试

11.3 性能

- 在线
- 并行
- 低峰

12. 最佳实践

  1. 定期 ANALYZE:检查
  2. ONLINE:生产
  3. 并行:大索引
  4. 低峰:执行
  5. 监控:使用率
  6. 删除未用:清理
  7. 测试:性能
  8. 自动化:调度
  9. 文档:记录
  10. 演练:定期

13. 参考资料

[1] Oracle Database Administrator’s Guide 19c, “Managing Indexes” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/