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

 找回密码
 注册

QQ登录

只需一步,快速开始

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

[Oracle] oracle创建索引参数 INVISIBLE 干嘛的

[复制链接]
跳转到指定楼层
楼主
发表于 2026-6-7 23:40:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在 Oracle 数据库中(从 11g 版本开始),INVISIBLE(不可见)参数被公认为是 DBA 的“神级后悔药”和“隐身测试服”。

简单来说,当您在建索引时加上 INVISIBLE,或者把一个现有的索引 ALTER 成 INVISIBLE 时,这个索引就进入了“隐身模式”。

为了让您彻底明白它的底层逻辑,我们可以把 INVISIBLE 索引的特点总结为“三管一不管”:

⚙️ 隐身模式下的真实状态
物理空间(管): 它真实存在于磁盘上,该占多少 GB 空间,一分都不会少。

数据同步(管): 当业务系统执行 INSERT、UPDATE、DELETE 时,Oracle 依然会在后台老老实实、实时地去维护和更新这个隐身索引的数据。

统计信息(管): 数据库平时收集统计信息时,依然会去分析它。

数据库优化器(不管 —— 最核心的区别!): 在默认情况下,Oracle 的优化器(CBO,也就是决定 SQL 怎么执行的大脑)会彻底把它当成空气。哪怕这个隐身索引是最优解,优化器也绝对不会选择走这条路。

💡 为什么需要这个参数?(两大杀手级应用场景)
这种“建了却不用”的设定看似自相矛盾,但在高并发、高危的生产环境中,它解决了 DBA 的两大核心痛点:

场景一:超级安全的“灰度发布”(安全试飞)
就像咱们处理 300GB 大表的情况:
如果在白天业务高峰期,您直接建一个正常的索引,万一这个新索引导致某个未知的核心老业务变慢了,整个医院系统可能瞬间瘫痪。

有了 INVISIBLE: 您可以放心地建!建完后,全院的业务依然走老路,毫无影响。

如何私下测试? 您可以在自己的电脑上单独开一个 SQL 窗口,执行下面这句“开天眼”的命令:

SQL
-- 仅在当前会话(您的窗口)中,允许使用不可见索引
ALTER SESSION SET optimizer_use_invisible_indexes = true;
然后您跑一下那个定时任务的 SQL,看看是不是真的变快了。确认完美无误后,再全局放开:ALTER INDEX ... VISIBLE;。这叫“无痛上线”。

场景二:不敢删老索引时的“软删除”(Soft Drop)
假设您接手了一个烂摊子,系统里有 100 个乱七八糟的旧索引。您凭经验觉得 IDX_OLD_01 根本没用,想删掉它释放几百 GB 空间。

直接 DROP 的灾难: 刚删完,财务部打电话来说月底结账的报表跑不出来了(原来那个报表一年只用一次,正好依赖这个老索引)。这时候您想重新建,得花几个小时,您肯定要背锅。

有了 INVISIBLE 的优雅操作: 您不删它,而是执行 ALTER INDEX IDX_OLD_01 INVISIBLE;。
把它隐藏起来。如果过了一个星期,没有任何人打电话来骂人,说明它真的没用,这时候您再放心大胆地 DROP 掉。如果刚隐藏十分钟就有人报障,您只需 0.1 秒执行 ALTER INDEX ... VISIBLE;,一切瞬间恢复原状。

总结
INVISIBLE 就是一个“带物理实体的测试开关”。它让您在不影响现有全局业务的前提下,在生产环境里拥有了犯错和试错的底气。这是高级数据库运维必备的安全护城河。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-17 23:23 , Processed in 0.339460 second(s), 20 queries .

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

© 2001-2020

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