2022-03-07
oracle普通表转分区表之后的唯一索引创建问题

oracle普通表转分区表之后的唯一索引创建问题
问题描述:
普通表cz_orderlist中有ORDERID, SPID,SUBTIME等字段,其中ORDERID, SPID构成组合式唯一索引
转为新分区表,使用SUBTIME按月分区。在对新分区表创建唯一索引时遇到问题:
SQL> create unique index uk_cz_orderlist on CZ_ORDERLIST(ORDERID, SPID) local;
create unique index uk_cz_orderlist on CZ_ORDERLIST(ORDERID, SPID) local
*
ERROR at line 1:
ORA-14039: partitioning columns must form a subset of key columns of a UNIQUE index
意思是如果创建本地唯一索引,则必须把分区列包含进去。
如果我按以下方式,能够正常创建:
create unique index uk_cz_orderlist on CZ_ORDERLIST(ORDERID, SPID, SUBTIME) local;
复制
有人会问,你为什么要创建本地索引,而不是全局索引呢?
因为我之所以把这张表转为分区表,就是需要定期删除历史数据,减少数据量以提高sql处理速度。这张表数据量非常大,且每分钟都有大量的相关DML操作。
而如果我使用全局索引,则在对历史分区进行truncate或drop时出现全局索引直接失效的问题。一旦此索引失效,则会对大多数条件中使用此索引的查询造成重大影响,大量锁等待,业务无法进行。
如果我按照上面的方法,把分区键SUBTIME加进去创建的唯一索引,这又不符合业务逻辑了!
为什么呢?因为之所以原表中有这个唯一索引,就是为了防止数据重复写入,但加了SUBTIME后已经不能实现这个功能了。原因是SUBTIME是按数据写入数据库时的sysdate获取的值,此时如果前后有两条相同的数据要写入到分区表的同一个分区之中,虽然ORDERID+SPID重复了(代表重复数据),但由于sysdate不一样,系统并不会报冲突,导致数据写入成功。这就与原来的应用逻辑有偏差,导致最终数据不一致。
说了这么多,我想问问大家,有什么办法解决这个问题吗?
(注:关于在truncate或drop时加rebuild online参数在线重建索引这种方案,实测不可行。因为数据量太大,重建索引也要耗费很长时间,同样会导致大量锁等待,业务无法进行)
我来答
添加附件
收藏
分享
问题补充
4条回答
默认
最新
回答交流
Markdown
请输入正文
提交
相关推荐
Oracle 在rman全库备份的时候,登录名rman target system/oracle@CDB和rman target / 有区别吗 ?
回答 3
单实例的话没什么区别,多实例就有区别!
Oracle adg里面能跑存储过程吗?
回答 2
已采纳
不可以
哪本书里面有对10053事件有详细的描述和案例呢
回答 1
已采纳
10053目前oracle官方不对外开放文档,只能在网上搜搜看了,这里我推荐几篇:Oracle的10053事件详解Oracle性能优化之10053事件DBA手记:DBA诊断利器Event10046和1
ORA-17507 如何解决?
回答 30
这是Oracle数据库的错误信息,主要是因为I/O请求的大小不是逻辑块大小的倍数导致的。Oracle数据库的逻辑块大小通常是2KB、4KB、8KB、16KB、32KB等,而I/O请求的大小必须是这些逻
大家好 新手一枚 请多关照哈
回答 2
相互交流学习
sql server management 导出数据到oracle出错
回答 2
先保证ODBC的配置可以正常访问到Oracle实例。另外检查path等环境变量设置是否包含了Oracle的相关路径
oracle 报错:ORA-12518:TNS:监听程序无法分发客户机连接,怎么解决?
回答 1
已采纳
1、首先判断是否由于监听配置不正确的原因导致?2、是否因为数据库服务器处于共享服务器模式,是否会因为DISPATCHERS的数量太少,导致在高峰期的时候无法及时的分配客户机连接呢?3、判断是否PROC
AHF orachk是什么
回答 2
AHF打错了
求一个红帽7生成oracle udev.rule的脚本。谢谢各位
回答 2
已采纳
供ASM使用的磁盘为sddsdi,defghi盘为ASM共享盘可以使用lsblk命令查看磁盘信息:lsblkNAMEMAJ:MINRMSIZEROTYPEMOUNTPOINTsda8:0020G0di
大佬们,Oracle系统的理论知识可以从哪找到啊,还有一些实战经验那些
回答 1
已采纳
可以多读点书,如果对那个问题点不懂,直接网上搜一下。实战经验的话这得实战没办法,即使看人家的故障总结报告,效果也不是太好,毕竟看和经历不是一回事儿。没事儿搭个测试环境,对有些问题做个复盘,测测,这样应
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~