将global的索引改成分区索引

今天有人在QQ上问,如何将global的索引改成分区索引?由于在同一个列上不能建不同名的索引,不然会报错:

除了删除重建索引外,我们其实可以用在线重定义的方法来重构索引。
下面是一个例子:
1、原表和其索引的建立:

2、插入数据:

3、创建目标表,且索引是local的分区索引:

4、进行在线重定义,注意我们在这里是用rowid在进行重定义的,因此options_flag=2,不然会报错ora-12089:

5、最后完成在线重定义(之前可以多次同步目标表):

至此,tab2表上的global索引已经改成local索引,后续的措施就是rename索引名至正常的索引名和去掉hidden列,在这里就不继续展开了。

相关文章

一条评论

  1. 之前也碰到过一次这样的问题,不过是先挑一个列最短的然后和原先列一起建一个复合索引,然后删除原索引,让SQL暂时使用复合索引。然后再建一个分区的索引,然后再把符合索引删除。这样风险其实比较高的,主要在如果删除原索引后SQL不走复合索引就玩完拉。但如果数据量很大,SQL执行又不是很频繁的话,应该比在线重定义简单点,而且少产生很多REDO

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据