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
| 项 | COALESCE | REBUILD |
|---|---|---|
| 锁 | 锁 | 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. 最佳实践
- 定期 ANALYZE:检查
- ONLINE:生产
- 并行:大索引
- 低峰:执行
- 监控:使用率
- 删除未用:清理
- 测试:性能
- 自动化:调度
- 文档:记录
- 演练:定期
13. 参考资料
[1] Oracle Database Administrator’s Guide 19c, “Managing Indexes” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/