分割槽表的不同操作對索引的影響

regonly1發表於2009-04-14

首先建立分割槽表測試資料:

create table test_partition_iptvbill partition by range(starttime) (
partition p_01 values less than(date '2008-02-02') tablespace dvboss,
partition p_02 values less than(date '2008-02-03') tablespace dvboss,
partition p_03 values less than(date '2008-02-04') tablespace dvboss,
partition p_04 values less than(date '2008-02-05') tablespace dvboss,
partition p_05 values less than(date '2008-02-06') tablespace dvboss,
partition p_06 values less than(date '2008-02-07') tablespace dvboss,
partition p_07 values less than(date '2008-02-08') tablespace dvboss)
storage(initial 10m next 10m minextents 1 maxextents unlimited pctincrease 0)
nologging as
select * from ow_iptv_bill ib
where ib.starttime < date '2008-02-08'
and ib.starttime >= date '2008-02-01';

建立索引:
--starttime本地索引
create index idx_testpi_starttime on test_partition_iptvbill(starttime) tablespace indx nologging local;
--subscriberid全域性索引
create index idx_testpi_subscriberid on test_partition_iptvbill(subscriberid) tablespace indx nologging;

測試內容分以下幾個部分:
日常對於分割槽的維護需要明確分割槽的操作對於索引的影響
1、drop一個空分割槽,所謂空分割槽就是分割槽已經建立,但是尚未有對應資料的情況
--增加一個空分割槽
alter table test_partition_iptvbill add partition p_08 values less than(date '2008-02-09') tablespace dvboss;
--將該分割槽drop
alter table test_partition_iptvbill drop partition p_08;
--檢查對於索引的影響
select ind.index_name, ind.status from user_indexes ind where ind.table_name = upper('test_partition_iptvbill');
可以發現索引狀態處於usable,即可用狀態。


2、重建索引

只能重建全域性索引:
alter index IDX_TESTPI_SUBSCRIBERID rebuild;

本地索引不能整體重建:
SQL> alter index IDX_TESTPI_STARTTIME rebuild;
 alter index IDX_TESTPI_STARTTIME rebuild
 ORA-14086: 不可以將區索引作為整體重建

要重建,只能根據user/dba_ind_partitions裡面指定的分割槽名進行單個重建:
SQL> select index_name, partition_name from  user_ind_partitions ip where ip.index_name = 'IDX_TESTPI_STARTTIME';
 
INDEX_NAME     PARTITION_NAME
------------------------------ ------------------------------
IDX_TESTPI_STARTTIME P_01
IDX_TESTPI_STARTTIME P_02
IDX_TESTPI_STARTTIME P_03
IDX_TESTPI_STARTTIME P_04
IDX_TESTPI_STARTTIME P_05
IDX_TESTPI_STARTTIME P_06
 
6 rows selected
 
SQL> alter index IDX_TESTPI_STARTTIME rebuild partition P_01;
 
Index altered

--檢查索引狀態已經變為有效狀態:
SQL> select index_name, status from user_indexes ind where ind.index_name = 'IDX_TESTPI_SUBSCRIBERID';
 
INDEX_NAME     STATUS
------------------------------ --------
IDX_TESTPI_SUBSCRIBERID VALID

3、drop/truncate非空分割槽將使全域性索引的狀態變成不可用狀態。這個已經在很早的Blog中提過不再做實驗。
對於本地索引只是將對應的索引分割槽刪除掉。不會影響整體索引狀態。


select * from user_part_indexes pi where pi.index_name = 'IDX_TESTPI_STARTTIME'
select * from user_ind_partitions ip where ip.index_name = 'IDX_TESTPI_STARTTIME'
select * from user_tab_partitions tp where tp.table_name = upper('test_partition_iptvbill')
select * from user_segments seg where seg.segment_name = upper('test_partition_iptvbill')

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12932950/viewspace-588968/,如需轉載,請註明出處,否則將追究法律責任。

相關文章