重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛

标题: oracle中1.5亿行大表索引重建安全指南 [打印本页]

作者: mahan    时间: 4 天前
标题: oracle中1.5亿行大表索引重建安全指南
千万别直接用普通的 CREATE INDEX 语法去建!

1.5 亿行数据属于大表,如果是核心业务系统,直接盲目建索引会引发严重的生产事故。

为什么不能直接建?
严重锁表(阻塞 DML): 默认情况下,创建索引会对表加锁。在 1.5 亿行的数据量下,这个过程可能会持续几十分钟甚至几个小时,期间表上的 INSERT、UPDATE、DELETE 操作会被全部阻塞,业务会直接卡死。

TEMP 表空间撑爆: 建索引需要对 1.5 亿行数据进行排序,这极其消耗临时(TEMP)表空间。如果 TEMP 空间不足,建到一半会直接报错 ORA-01652(Oracle)或类似错误,导致前功尽弃。

I/O 和 CPU 飙升: 全表扫描和海量排序会导致数据库主机的 I/O 吞吐和 CPU 负载瞬间打满,影响同一实例上的其他数据库或实例(例如同集群的其他 RAC 节点)。

安全重建索引的最佳实践
根据使用的数据库类型,这里有安全重建的操作方案:


在生产环境中,必须结合 ONLINE(在线) 和 PARALLEL(并行) 来创建。

评估 TEMP 表空间: 先检查 TEMP 表空间是否足够大(1.5亿行通常需要几十GB以上的空闲 TEMP 空间)。

执行在线并行创建:

SQL
CREATE INDEX idx_your_index_name
ON your_table_name(your_column_name)
ONLINE
PARALLEL 8; -- 并行度根据你的 CPU 核心数和系统当前负载调整,一般 4 到 8
注意:ONLINE 允许在建索引期间业务继续对表进行 DML 操作。它只在开始和结束的瞬间获取极短暂的字典锁。

关闭并行(非常重要): 索引建好后,必须将索引的并行度改回 1,否则后续正常的单会话查询走到这个索引时也会发起并行,压垮 CPU。

SQL
ALTER INDEX idx_your_index_name NOPARALLEL;
关于 NOLOGGING 的考量: 为了加快速度,很多人会加 NOLOGGING 减少 Redo 日志生成。但如果你背后挂着 Data Guard (ADG) 备库,千万不要随意用 NOLOGGING。如果主库强制开启了 FORCE LOGGING,加了也没用;如果没有开启,NOLOGGING 会导致备库相应的索引块损坏(出现坏块),主备同步会出大问题。







欢迎光临 重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛 (http://bbs.cqsztech.com/) Powered by Discuz! X3.2