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条回答
默认
最新
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
