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

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 11|回复: 0
打印 上一主题 下一主题

[Oracle] oracle中1.5亿行大表索引重建安全指南

[复制链接]
跳转到指定楼层
楼主
发表于 4 天前 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
千万别直接用普通的 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 会导致备库相应的索引块损坏(出现坏块),主备同步会出大问题。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2026-4-30 07:56 , Processed in 0.214734 second(s), 21 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表