oracle 11g SKIP_UNUSABLE_INDEXES参数

SKIP_UNUSABLE_INDEXES的作用是在DML期间跳过对索引的维护,这样可以提交DML的效率,可以事后一次性重建,但是SKIP_UNUSABLE_INDEXES=y对unique index不起作用,因为此时的unique index扮演者constraint的作用所以在insert数据时index必须被更新。我们最近遇到个场景比较麻烦,使用sql load direct加载的数据,有一个id字段因为并行加载无法通过sequence生成唯一值,需要在加载完成后使用update set = seq.nextval生成序列号,但是update无法跳过唯一索引,也就是上面提到的。但是靠业务代码中drop/create index每个表硬编码太不现实、维护性也差,因为我们有数百处这样的逻辑,于是研究出了一个变通的方法,写个存储过程,首先查询某个表的所有唯一索引定义,将其删除,然后重建为非唯一索引并标记为unusable,这样索引定义在但是不维护,这么做的优点是索引定义保持了又不耗费时间,如下:

select count(1) from ta_textparameter
drop index idx_xx; --2500w记录
create index idx_xx on ta_textparameter(l_rowid,c_tenantid,c_paramlevel,c_paramclass,c_paramitem,c_tacode,c_managercode,c_fundcode,c_agencyno) nologging;
--166秒
drop index idx_xx; --2500w记录
create index idx_xx on ta_textparameter(l_rowid,c_tenantid,c_paramlevel,c_paramclass,c_paramitem,c_tacode,c_managercode,c_fundcode,c_agencyno) unusable nologging;
--0.01秒

posted @   zhjh256  阅读(828)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2016-08-24 dbcp/c3p0连接池设置mysql会话变量
2016-08-24 mysql init-file参数中语句限制
点击右上角即可分享
微信分享提示