4.3 索引重建问题 (1)分区索引 对于分区索引,不能整体进行重建,只能对单个分区进行重建。语法如下: Alter index idx_name rebuild partition index_partition_name [online nologging] 说明: online:表示重建的时候不会锁表。 nologging:表示建立索引的时候不生成日志,加快速度。 如果要重建分区索引,只能drop表原索引,在重新创建: SQL>create index loc_xxxx_col on xxxx(col) local tablespace SYSTEM; 这个操作要求较大的临时表空间和排序区。 示例: SQL> select index_name,partition_name from user_ind_partitions where index_name='I_TIME_GLOBAL'; INDEX_NAME PARTITION_NAME ------------------------------ ------------------------------ I_TIME_GLOBAL P1 I_TIME_GLOBAL P2 SQL>alter index I_TIME_GLOBAL rebuild partition p1 online nologging; 索引已更改。 SQL>alter index I_TIME_GLOBAL rebuild partition p2 online nologging; 索引已更改。 (2)全局索引 Oracle 会自动维护分区索引,对于全局索引,如果在对分区表操作时,没有指定update index,则会导致全局索引失效,需要重建。 SQL> select owner,index_name,table_name,status from dba_indexes where INDEX_NAME='IX_PDBA_GLOBAL'; owner index_name table_name status ------------------------------ ------------------------------ ---------- ------- sys ix_pdba_global pdba valid 删除一个分区: SQL> alter table pdba drop partition p2; 表已更改。 SQL> select owner,index_name,table_name,status from dba_indexes where INDEX_NAME='IX_PDBA_GLOBAL'; owner index_name table_name status ------------------------------ ------------------------------ ---------- ------- sys ix_pdba_global pdba valid split 分区: SQL> alter table pdba split partition P4 at(TO_DATE('2010-12-21 00:00:00','YYYY-MM-DD HH24:MI:SS')) into (partition P4, partition P5); 表已更改。 SQL> select owner,index_name,table_name,status from dba_indexes where INDEX_NAME='IX_PDBA_GLOBAL'; owner index_name table_name status ------------------------------ ------------------------------ ---------- ------- sys ix_pdba_global pdba valid drop 分区时使用update indexes SQL> alter table pdba drop partition P4 UPDATE INDEXES; 表已更改。 SQL> select owner,index_name,table_name,status from dba_indexes where INDEX_NAME='IX_PDBA_GLOBAL'; owner index_name table_name status ---------------------- ------------------------------ ---------- ------- sys ix_pdba_global pdba valid 做了几个drop分区操作,全局索引没有失效,有点奇怪。 不过如果在生产环境中,还是小心点。 重建全局索引命令如下: Alter index idx_name rebuild [online nologging] 示例: SQL> Alter index ix_pdba_global rebuild online nologging; 索引已更改。 补充一点,分区表存储空间的问题: SQL> select table_name,partition_name,tablespace_name from user_tab_partitions where table_name='DBA'; TABLE_NAME PARTITION_NAME TABLESPACE_NAME ---------- ------------------------------ ------------------------------ DBA P1 SYSTEM DBA P2 SYSTEM DBA P3 SYSTEM DBA P4 SYSTEM 通过user_tab_partitions 表可以查看到每个分区对应的tablesapce_name. 但是,如果通过all_tables 表,却查不到分区表对应表空间的信息。 分区表: SQL> select owner,table_name,tablespace_name,cluster_name from all_tables where table_name='DBA'; OWNER TABLE_NAME TABLESPACE_NAME CLUSTER_NAME ----- ---------- ------------------------------ ----------------------------------------------------- SYS DBA 普通表: SQL> select owner,table_name,tablespace_name,cluster_name from all_tables where table_name='DAVE'; OWNER TABLE_NAME TABLESPACE_NAME CLUSTER_NAME ----- ---------- ------------------------------ --------------------------------------------------- SYS DAVE SYSTEM |