在Oracle中,使用ONLINE
选项创建索引可在不阻塞DML操作(增删改)的情况下完成索引构建,适用于生产环境。
⚡ 一、语法与核心特性
-
基础语法
CREATE INDEX 索引名 ON 表名(列名) ONLINE;
- 示例:
CREATE INDEX idx_user_id ON user_info(user_id) ONLINE;
- 示例:
-
锁机制区别
- ONLINE模式:仅锁定行(Row-S/SS级锁),允许并发DML操作(如INSERT/UPDATE/DELETE)。
- 非ONLINE模式:锁定整个表(TM表级锁),阻塞所有DML操作直至索引创建完成。
- 安全性:
ONLINE
模式通过临时日志表(SYS_JOURNAL_xxx
)记录重建期间的DML变更,完成后合并增量数据 。
-
性能对比
方式 速度 并发支持 适用场景 ONLINE
较慢 ✅ 支持 高并发生产环境 非 ONLINE
较快 ❌ 阻塞 维护窗口或无业务时段
🔧 二、进阶用法与注意事项
-
指定表空间与存储参数
CREATE INDEX idx_name ON table_name(column) ONLINE TABLESPACE users PCTFREE INITRANS;
TABLESPACE
:索引存储的表空间,避免与数据争用I/O。PCTFREE
:预留块空间比例(默认10%),防止频繁分裂。
-
大表优化建议 58
- 并行创建(企业版支持):
CREATE INDEX idx_name ON table_name(column) ONLINE PARALLEL 4;
- 避开高峰期:重建亿级大表索引时,监控
log file parallel write
等等待事件 。
- 并行创建(企业版支持):
-
索引类型扩展
- 联合索引:
CREATE INDEX idx_multi ON table(col1, col2) ONLINE;
- 函数索引:
CREATE INDEX idx_func ON table(UPPER(name)) ONLINE;
- 联合索引:
️ 三、操作注意事项
-
适用场景
- 必须使用
ONLINE
的场景:7x24小时服务、高并发业务表 。 - 可不用
ONLINE
的场景:小型表、维护窗口期 。
- 必须使用
-
限制与风险
- 空间消耗:需额外存储日志表,确保表空间充足 。
- 兼容性:
ONLINE
不支持位图索引、聚簇索引 。
-
操作后验证
- 检查索引状态:
SELECT index_name, status FROM user_indexes WHERE table_name='表名';
- 查看索引字段:
SELECT * FROM all_ind_columns WHERE index_name='索引名';
- 检查索引状态:
💎 四、总结建议
- 生产环境必选:始终使用
ONLINE
选项创建索引,避免锁表导致业务中断 。 - 性能权衡:对大表启用并行度(
PARALLEL
),结合业务低峰期操作 。 - 索引设计原则:仅对高频查询列建索引,避免过度索引影响DML效率 。
可通过
ALTER INDEX ... REBUILD ONLINE;
在线重建现有索引(11g+优化锁机制)67。选项