对于经常有delete,insert 的表来说,其对应索引应该经常重建,以减小索引的大小,提高数据库的性能。
写了一个sql:
SELECT 'alter index '||t.index_name||' rebuild partition '||t.partition_name||';'
FROM user_ind_partitions t WHERE t.index_name='IDX2_EVT_BAG_MAIL_RELA_SEA_T'
AND t.partition_name<'P20121122'
将拼出来的sql执行对索引经常重建报:
ORA-14257: cannot move partition other than a Range or Hash partition
发现原来此表是前几个月建的符合分区表,分区是按照range分区,子分区是hash分区。
因此这种写法是有问题的,应该直接重建子分区,重新调整上面的sql:
SELECT 'alter index '||t.index_name||' rebuild subpartition '||t.subpartition_name||';'
FROM user_ind_subpartitions t WHERE t.index_name='IDX2_EVT_BAG_MAIL_RELA_SEA_T'
AND t.partition_name<'P20121122';
SQL> alter index IDX2_EVT_BAG_MAIL_RELA_SEA_T rebuild subpartition SYS_SUBP16612;
Index altered
SQL> alter index IDX2_EVT_BAG_MAIL_RELA_SEA_T rebuild subpartition SYS_SUBP16613;
Index altered
SQL> alter index IDX2_EVT_BAG_MAIL_RELA_SEA_T rebuild subpartition SYS_SUBP16614;
Index altered
SQL> alter index IDX2_EVT_BAG_MAIL_RELA_SEA_T rebuild subpartition SYS_SUBP16615;
Index altered
SQL> alter index IDX2_EVT_BAG_MAIL_RELA_SEA_T rebuild subpartition SYS_SUBP16616;
Index altered
SQL> alter index IDX2_EVT_BAG_MAIL_RELA_SEA_T rebuild subpartition SYS_SUBP16617;
Index altered
SQL> alter index IDX2_EVT_BAG_MAIL_RELA_SEA_T rebuild subpartition SYS_SUBP16618;
Index altered
SQL> alter index IDX2_EVT_BAG_MAIL_RELA_SEA_T rebuild subpartition SYS_SUBP16619;
Index altered
SQL> alter index IDX2_EVT_BAG_MAIL_RELA_SEA_T rebuild subpartition SYS_SUBP16620;
重建成功!