Oracle 数据库中,索引是提高查询性能的关键对象,但随着数据频繁的增删改操作,索引可能会产生碎片化,导致查询效率下降,重建索引是解决索引碎片化、优化性能的重要手段,本文将详细介绍 Oracle 重建索引的命令、使用场景、注意事项及最佳实践。

重建索引的语法与基本用法
Oracle 中重建索引主要通过 ALTER INDEX 语句实现,基本语法如下:
ALTER INDEX index_name
REBUILD [ ONLINE ] [
TABLESPACE tablespace_name
] [
PARALLEL parallel_degree
] [
NOLOGGING
] [
REVERSE
] [
COMPUTE STATISTICS
];
参数说明:
- index_name:要重建的索引名称,必须为已存在的索引。
- ONLINE:指定在线重建,避免阻塞 DML 操作(增删改),若未指定,重建期间表上的 DML 操作将被阻塞,适用于对业务影响较小的维护窗口。
- TABLESPACE tablespace_name:指定重建后的索引存储表空间,若未指定,则使用原表空间。
- PARALLEL parallel_degree:指定并行重建的进程数,适用于大索引重建,可显著缩短时间,需确保数据库并行服务器配置合理。
- NOLOGGING:减少重建过程中的日志生成,提高速度,但会增加数据丢失风险(如介质恢复时无法恢复该索引),建议在备份后谨慎使用。
- REVERSE:重建为反向键索引,适用于高并发插入场景,减少索引争用,但会增加查询时的 I/O 开销。
- COMPUTE STATISTICS:重建时收集索引统计信息,优化器可基于更准确的统计信息生成执行计划。
重建索引的使用场景
并非所有索引都需要定期重建,通常在以下情况考虑重建:
- 索引碎片率高:通过
DBA_INDEXES视图查询BLEVEL(索引深度)、DISTINCT_KEYS(唯一键数量)等字段,或使用ANALYZE INDEX index_name VALIDATE STRUCTURE后查询INDEX_STATS视图,若HEIGHT或DEL_LF_ROWS(删除的叶子行数)占比过高,说明碎片严重。 - 查询性能下降:对于频繁查询的索引,若执行计划中全表扫描比例增加,可能因索引效率降低导致。
- 索引存储空间不足:频繁删除数据后,索引可能存在大量空闲空间,重建可回收空间并优化存储结构。
- 索引结构损坏:通过
ALTER INDEX index_name REBUILD可修复轻微的索引块损坏。
重建索引的注意事项
- 权限要求:执行重建需具有索引所在表的
ALTER权限或DBA权限。 - 锁与并发:未指定
ONLINE时,重建期间会锁定索引表,阻塞所有 DML 操作,业务高峰期应避免使用。ONLINE重建需额外 undo 表空间和临时表空间支持,且可能产生少量锁争用。 - 资源消耗:重建大索引会消耗大量 I/O 和 CPU 资源,建议在低峰期执行,并结合
PARALLEL参数控制资源占用。 - 统计信息更新:重建后索引结构变化,建议手动执行
ANALYZE INDEX index_name COMPUTE STATISTICS或使用DBMS_STATS收集统计信息,避免优化器依赖过时统计信息。 - 特殊索引处理:唯一索引、位图索引、函数索引等重建时需注意语法兼容性,例如函数索引重建需确保函数定义未变更。
重建索引的最佳实践
- 优先使用 ONLINE 重建:对业务连续性要求高的系统,始终指定
ONLINE选项,减少阻塞。 - 并行度调整:根据服务器 CPU 核心数和索引大小设置并行度,一般建议
PARALLEL Degree = CPU_COUNT * 2,但需避免过高导致资源争用。 - 分批重建:对于大量索引,可按业务优先级分批重建,避免单次操作耗时过长。
- 监控与验证:重建前后可通过
DBA_INDEXES视图对比索引参数(如BLEVEL、LAST_ANALYZED),并通过执行计划验证查询性能提升效果。 - 备份与回滚:重建前建议备份数据库,尤其是使用
NOLOGGING时,防止介质恢复问题。
相关操作示例
基本重建
ALTER INDEX idx_emp_id REBUILD;
在线重建并指定并行度
ALTER INDEX idx_emp_name REBUILD ONLINE PARALLEL 4;
重建并统计信息
ALTER INDEX idx_emp_salary REBUILD COMPUTE STATISTICS;
重建到指定表空间
ALTER INDEX idx_emp_dept REBUILD TABLESPACE users_ts;
相关问答 FAQs
Q1:重建索引和重组索引(ALTER INDEX REORGANIZE)有什么区别?
A:重组索引(ALTER INDEX index_name REORGANIZE)仅整理索引碎片,不回收空间,且支持在线操作,适用于碎片率不高(如删除行占比 < 20%)的场景,耗时短、资源消耗低,重建索引(REBUILD)会重新构建整个索引结构,回收空间,彻底消除碎片,但耗时较长,资源消耗大,通常碎片率低时优先重组,碎片率高时重建。
Q2:如何判断索引是否需要重建?
A:可通过以下步骤判断:

- 执行
ANALYZE INDEX index_name VALIDATE STRUCTURE;收集索引结构信息。 - 查询
INDEX_STATS视图,计算DEL_LF_ROWS / LF_ROWS(删除行占比),若超过 20%~30%,或HEIGHT(索引深度)明显增大,说明碎片严重,建议重建。 - 结合 AWR 报告或 SQL Trace,查看索引的物理读、逻辑读及全表扫描比例,若性能显著下降,也可作为重建依据。
