分區操作後分區索引和全局索引的狀態

一、對空分區split和merge操作後的狀態

1、創建分區表
create table test_part_index
(
id int,
name varchar2(20)
)
partition by range (id)
(partition p1 values less than (5),
partition p2 values less than (10),
partition p3 values less than (15),
partition p4 values less than (maxvalue)
);
2、創建全局和分區索引
create index ind_g_id on test_part_index(id);
create index ind_l_name on test_part_index(name) local;
3、插入測試數據
insert into test_part_index values (3,'lpp');
insert into test_part_index values (6,'lpp01');
commit;
4、查看索引狀態
select index_name,status from user_indexes where table_name='TEST_PART_INDEX';
index_name  status

IND_L_NAME    N/A
IND_G_ID    VALID

select index_name,status from user_ind_partitions where index_name='IND_L_NAME';
index_name partition_name  status

IND_L_NAME    P1    USABLE
IND_L_NAME    P2    USABLE
IND_L_NAME    P3    USABLE
IND_L_NAME    P4    USABLE
--索引狀態正常
5、對空的maxvalue分區進行拆分

alter table test_part_index split partition p4 at (20) into (partition p4,partition p5);

6、查看索引狀態
select index_name,status from user_indexes where table_name='TEST_PART_INDEX';
index_name  status

IND_L_NAME    N/A
IND_G_ID    VALID

select index_name,status from user_ind_partitions where index_name='IND_L_NAME';
index_name partition_name  status

IND_L_NAME    P1    USABLE
IND_L_NAME    P2    USABLE
IND_L_NAME    P3    USABLE
IND_L_NAME    P4    USABLE
IND_L_NAME    P5    USABLE
--索引狀態正常
7、合併p4,p5兩個空分區
alter table test_part_index merge partitions p4,p5 into partition p5;--注意只能用名稱P5,否則會報錯

8、查看索引狀態
select index_name,status from user_indexes where table_name='TEST_PART_INDEX';
index_name  status

IND_L_NAME    N/A
IND_G_ID    VALID

select index_name,status from user_ind_partitions where index_name='IND_L_NAME';
index_name partition_name  status

IND_L_NAME    P1    USABLE
IND_L_NAME    P2    USABLE
IND_L_NAME    P3    USABLE
IND_L_NAME    P5    USABLE
--索引狀態正常

二、對存在數據的分區進行split和merge後的操作導致的狀態


9、對maxvalue分區插入數據
insert into test_part_index values (23,'lpp02');
commit;
10、查看索引狀態
select index_name,status from user_indexes where table_name='TEST_PART_INDEX';
index_name  status

IND_L_NAME    N/A
IND_G_ID    VALID

select index_name,status from user_ind_partitions where index_name='IND_L_NAME';
index_name partition_name  status

IND_L_NAME    P1    USABLE
IND_L_NAME    P2    USABLE
IND_L_NAME    P3    USABLE
IND_L_NAME    P5    USABLE
11、對maxvalue分區進行拆分
alter table test_part_index split partition p5 at (20) into (partition p4,partition p5);
12、查看索引狀態
select index_name,status from user_indexes where table_name='TEST_PART_INDEX';
index_name  status

IND_L_NAME    N/A
IND_G_ID    VALID

select index_name,status from user_ind_partitions where index_name='IND_L_NAME';
index_name partition_name  status

IND_L_NAME    P1    USABLE
IND_L_NAME    P2    USABLE
IND_L_NAME    P3    USABLE
IND_L_NAME    P4    USABLE
IND_L_NAME    P5    USABLE
--索引狀態正常
13、合併P4,P5兩分區
alter table test_part_index merge partitions p4,p5 into partition p5;
14、查看索引狀態
select index_name,status from user_indexes where table_name='TEST_PART_INDEX';
index_name  status

IND_L_NAME    N/A
IND_G_ID    UNUSABLE

select index_name,status from user_ind_partitions where index_name='IND_L_NAME';
index_name partition_name  status

IND_L_NAME    P1    USABLE
IND_L_NAME    P2    USABLE
IND_L_NAME    P3    USABLE
IND_L_NAME    P5    UNUSABLE
--全局索引失效,P5分區索引失效
15、重建失效索引
alter index IND_G_ID rebuild;
alter index IND_L_NAME rebuild partition p5;
16、查看索引狀態
select index_name,status from user_indexes where table_name='TEST_PART_INDEX';
index_name  status

IND_L_NAME    N/A
IND_G_ID    VALID

select index_name,status from user_ind_partitions where index_name='IND_L_NAME';
index_name partition_name  status

IND_L_NAME    P1    USABLE
IND_L_NAME    P2    USABLE
IND_L_NAME    P3    USABLE
IND_L_NAME    P5    USABLE
17、再對maxvalue分區插入一條數據
insert into test_part_index values (18,'lpp03');
commit;
18、查看數據及rowid
id  name    rowid
3    lpp        AAAV1hAAEAAADywAAA
6    lpp01    AAAV1iAAEAAAECuAAA
23    lpp02    AAAV11AAEAAAFCSAAA
18    lpp03    AAAV11AAEAAAFCxAAA

19、查看索引狀態
select index_name,status from user_indexes where table_name='TEST_PART_INDEX';
index_name  status

IND_L_NAME    N/A
IND_G_ID    VALID

select index_name,status from user_ind_partitions where index_name='IND_L_NAME';
index_name partition_name  status

IND_L_NAME    P1    USABLE
IND_L_NAME    P2    USABLE
IND_L_NAME    P3    USABLE
IND_L_NAME    P5    USABLE
--索引狀態正常
20、對maxvalue分區進行拆分
alter table test_part_index split partition p5 at (20) into (partition p4,partition p5);
21、查看索引狀態
select index_name,status from user_indexes where table_name='TEST_PART_INDEX';
index_name  status

IND_L_NAME    N/A
IND_G_ID    UNUSABLE

select index_name,status from user_ind_partitions where index_name='IND_L_NAME';
index_name partition_name  status

IND_L_NAME    P1    USABLE
IND_L_NAME    P2    USABLE
IND_L_NAME    P3    USABLE
IND_L_NAME    P4    UNUSABLE
IND_L_NAME    P5    UNUSABLE
--全局索引失效,P4,P5分區索引失效
22、查看數據及rowid
id  name    rowid
3    lpp        AAAV1hAAEAAADywAAA
6    lpp01    AAAV1iAAEAAAECuAAA
18    lpp03    AAAV19AAEAAAEySAAA 
23    lpp02    AAAV1+AAEAAAEiSAAA 
--rowid發生變化
23、重建失效索引
alter index IND_G_ID rebuild;
alter index IND_L_NAME rebuild partition p4;
alter index IND_L_NAME rebuild partition p5;
24、查看索引狀態
select index_name,status from user_indexes where table_name='TEST_PART_INDEX';
index_name  status

IND_L_NAME    N/A
IND_G_ID    VALID

select index_name,status from user_ind_partitions where index_name='IND_L_NAME';
index_name partition_name  status

IND_L_NAME    P1    USABLE
IND_L_NAME    P2    USABLE
IND_L_NAME    P3    USABLE
IND_L_NAME    P4    USABLE
IND_L_NAME    P5    USABLE
25、合併P4,P5兩分區
alter table test_part_index merge partitions p4,p5 into partition p5;
26、查看索引狀態
select index_name,status from user_indexes where table_name='TEST_PART_INDEX';
index_name  status

IND_L_NAME    N/A
IND_G_ID    UNUSABLE

select index_name,status from user_ind_partitions where index_name='IND_L_NAME';
index_name partition_name  status

IND_L_NAME    P1    USABLE
IND_L_NAME    P2    USABLE
IND_L_NAME    P3    USABLE
IND_L_NAME    P5    UNUSABLE
--全局索引失效,P5分區索引失效
27、查看數據及rowid
id  name    rowid
3    lpp        AAAV1hAAEAAADywAAA
6    lpp01    AAAV1iAAEAAAECuAAA
18    lpp03    AAAV2EAAEAAAFCSAAA 
23    lpp02    AAAV2EAAEAAAFCSAAB
--rowid發生變化
28、重建失效索引
alter index IND_G_ID rebuild;
alter index IND_L_NAME rebuild partition p5;
29、查看索引狀態
select index_name,status from user_indexes where table_name='TEST_PART_INDEX';
index_name  status

IND_L_NAME    N/A
IND_G_ID    VALID

select index_name,status from user_ind_partitions where index_name='IND_L_NAME';
index_name partition_name  status

IND_L_NAME    P1    USABLE
IND_L_NAME    P2    USABLE
IND_L_NAME    P3    USABLE
IND_L_NAME    P5    USABLE
30、刪除id爲23的數據
delete from TEST_PART_INDEX where id=23;
commit;
31、對maxvalue分區進行拆分
alter table test_part_index split partition p5 at (20) into (partition p4,partition p5);
32、查看索引狀態
select index_name,status from user_indexes where table_name='TEST_PART_INDEX';
index_name  status

IND_L_NAME    N/A
IND_G_ID    VALID

select index_name,status from user_ind_partitions where index_name='IND_L_NAME';
index_name partition_name  status

IND_L_NAME    P1    USABLE
IND_L_NAME    P2    USABLE
IND_L_NAME    P3    USABLE
IND_L_NAME    P4    USABLE
IND_L_NAME    P5    USABLE
--索引狀態正常
33、查看數據及rowid
id  name    rowid
3    lpp        AAAV1hAAEAAADywAAA
6    lpp01    AAAV1iAAEAAAECuAAA
18    lpp03    AAAV19AAEAAAEySAAA
--rowid未發生變化

三、對空分區truncate和drop後的索引狀態


34、truncate空的maxvalue分區
alter table TEST_PART_INDEX truncate partition p5;
35、查看索引狀態
select index_name,status from user_indexes where table_name='TEST_PART_INDEX';
index_name  status

IND_L_NAME    N/A
IND_G_ID    VALID

select index_name,status from user_ind_partitions where index_name='IND_L_NAME';
index_name partition_name  status

IND_L_NAME    P1    USABLE
IND_L_NAME    P2    USABLE
IND_L_NAME    P3    USABLE
IND_L_NAME    P4    USABLE
IND_L_NAME    P5    USABLE
--索引狀態正常
36、drop空的maxvalue分區
alter table TEST_PART_INDEX drop partition p5;
37、查看索引狀態
select index_name,status from user_indexes where table_name='TEST_PART_INDEX';
index_name  status

IND_L_NAME    N/A
IND_G_ID    VALID

select index_name,status from user_ind_partitions where index_name='IND_L_NAME';
index_name partition_name  status

IND_L_NAME    P1    USABLE
IND_L_NAME    P2    USABLE
IND_L_NAME    P3    USABLE
IND_L_NAME    P4    USABLE
--索引狀態正常,p5分區索引消失
38、新增maxvalue分區
alter table TEST_PART_INDEX add partition p5 values less than (maxvalue);
39、查看索引狀態
select index_name,status from user_indexes where table_name='TEST_PART_INDEX';
index_name  status

IND_L_NAME    N/A
IND_G_ID    VALID

select index_name,status from user_ind_partitions where index_name='IND_L_NAME';
index_name partition_name  status

IND_L_NAME    P1    USABLE
IND_L_NAME    P2    USABLE
IND_L_NAME    P3    USABLE
IND_L_NAME    P4    USABLE
IND_L_NAME    P5    USABLE
--索引狀態正常

四、對存在數據的分區進行truncate和drop後的索引狀態


40、插入數據到maxvalue分區
insert into test_part_index values (24,'lpp02');
commit;
41、查看索引狀態
select index_name,status from user_indexes where table_name='TEST_PART_INDEX';
index_name  status

IND_L_NAME    N/A
IND_G_ID    VALID

select index_name,status from user_ind_partitions where index_name='IND_L_NAME';
index_name partition_name  status

IND_L_NAME    P1    USABLE
IND_L_NAME    P2    USABLE
IND_L_NAME    P3    USABLE
IND_L_NAME    P4    USABLE
IND_L_NAME    P5    USABLE
--索引狀態正常
42、truncate maxvalue分區
alter table TEST_PART_INDEX truncate partition p5;
43、查看索引狀態
select index_name,status from user_indexes where table_name='TEST_PART_INDEX';
index_name  status

IND_L_NAME    N/A
IND_G_ID    UNUSABLE

select index_name,status from user_ind_partitions where index_name='IND_L_NAME';
index_name partition_name  status

IND_L_NAME    P1    USABLE
IND_L_NAME    P2    USABLE
IND_L_NAME    P3    USABLE
IND_L_NAME    P4    USABLE
IND_L_NAME    P5    USABLE
--全局索引失效
44、重建全局索引
alter index IND_G_ID rebuild;
45、查看索引狀態
select index_name,status from user_indexes where table_name='TEST_PART_INDEX';
index_name  status

IND_L_NAME    N/A
IND_G_ID    VALID

select index_name,status from user_ind_partitions where index_name='IND_L_NAME';
index_name partition_name  status

IND_L_NAME    P1    USABLE
IND_L_NAME    P2    USABLE
IND_L_NAME    P3    USABLE
IND_L_NAME    P4    USABLE
IND_L_NAME    P5    USABLE
--索引狀態正常
46、插入數據到maxvalue分區
insert into test_part_index values (24,'lpp02');
commit;
46、drop maxvalue分區
alter table TEST_PART_INDEX drop partition p5;
47、查看索引狀態
select index_name,status from user_indexes where table_name='TEST_PART_INDEX';
index_name  status

IND_L_NAME    N/A
IND_G_ID    UNUSABLE

select index_name,status from user_ind_partitions where index_name='IND_L_NAME';
index_name partition_name  status

IND_L_NAME    P1    USABLE
IND_L_NAME    P2    USABLE
IND_L_NAME    P3    USABLE
IND_L_NAME    P4    USABLE
--全局索引失效


五、總結:


1、針對空的分區進行split,merge,truncate和drop操作都不會導致全局和分區索引失效
2、針對有數據的分區,如果split後的數據都在某一個分區裏,不會導致全局和分區索引失效,如果split後的分區都有數據,則全局索引和對應分區的分區索引都會失效
3、針對有數據的分區,merge操作會導致全局和分區索引失效
4、針對有數據的分區,truncate和drop操作都會導致全局索引失效

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章