首先,使用12c以上的版本大法好
前提:创建分区表,存在4个分区,每个分区中都有数据,创建全局索引,状态VALID。
如果此时删除分区,全局索引会失效,状态UNUSABLE状态。
原理Oracle中索引是以B树的结构存储的。包括了索引键值,rowid信息,而且按照索引键值有序排列,当通过索引扫描需要回表的时候,能利用rowid直接定位到索引键值对应的数据块,这是最快的数据访问方式。当我们删除表中数据的时候,同时也要删除对应的索引,因为索引有序排列,如果要删除一条索引数据,组织结构需要调整,以保证正确的排列顺序,12c之前,某种原因,无法再删除分区的同时对索引重新构建,所以此时索引状态是失效,于其是错的,宁可不让用。
删除分区,需要手工rebuild重建索引才能生效。
那么如果,全局索引的状态失效,是因为索引对应的分区中数据被删除,那么如果,分区中的数据不被删除,索引结构不需调整,状态是不是就是正常的?
首先重建索引,让其生效,此时通过delete删除第二分区的数据,再次执行分区删除将第二分区删除。全局索引状态未失效为VALID。
数据不需要被删除,无需调整索引结构,全局索引的状态就无需置为失效,这个算是对待分区删除避免全局索引失效的一种解决方案。
--转,总结自云和恩墨 墨天轮