本地分区索引spit测试
测试结论:注意是非复合分区表,如果split不移动数据,分区索引不会失效
也就是说split的时候,没有把数据拆分到两个分区,那么新旧分区的本地索引就不会失效。
哪怕有1条记录被拆分到了新分区,本地索引都将失效,需要重建分区索引。
测试发现复合分区表全局索引和本地索引都失效,需重建。
以下为测试记录:
[oracle@lncs ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Tue Dec 31 12:06:54 2024
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> conn jyc/jyc
Connected.
SQL> drop table part_tab_drop purge;
create table part_tab_drop (id int,col2 int ,col3 int,contents varchar2(4000))
partition by range (id)
(
partition p1 values less than (10000),
partition p2 values less than (20000),
partition p3 values less than (maxvalue)
)
drop table part_tab_drop purge
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> 2 3 4 5 6 7 8 ;
insert into part_tab_drop select rownum ,rownum+1,rownum+2,rpad('*',400,'*') from dual connect by rownum <=50000;
commit;
Table created.
SQL>
50000 rows created.
SQL>
SQL>
SQL> commit;
Commit complete.
SQL> create index idx_part_drop_col2 on part_tab_drop(col2) local;
Index created.
SQL> select index_name,status from user_indexes where index_name='IDX_PART_DROP_COL2';
INDEX_NAME STATUS
------------------------------ --------
IDX_PART_DROP_COL2 N/A
SQL> select index_name, partition_name, status
from user_ind_partitions
2 3 where index_name = 'IDX_PART_DROP_COL2';
INDEX_NAME PARTITION_NAME STATUS
------------------------------ ------------------------------ --------
IDX_PART_DROP_COL2 P1 USABLE
IDX_PART_DROP_COL2 P2 USABLE
IDX_PART_DROP_COL2 P3 USABLE
SQL> select max(id) from part_tab_drop;
MAX(ID)
----------
50000
SQL>
SQL>
SQL> ALTER TABLE part_tab_drop
2 SPLIT PARTITION p3 AT (50000)
3 INTO (
4 PARTITION p5,
5 PARTITION P_MAX
6 );
Table altered.
SQL> select index_name, partition_name, status from user_ind_partitions where index_name = 'IDX_PART_DROP_COL2';
INDEX_NAME PARTITION_NAME STATUS
------------------------------ ------------------------------ --------
IDX_PART_DROP_COL2 P1 USABLE
IDX_PART_DROP_COL2 P2 USABLE
IDX_PART_DROP_COL2 P5 UNUSABLE
IDX_PART_DROP_COL2 P_MAX UNUSABLE
SQL> ALTER TABLE part_tab_drop
2 SPLIT PARTITION P_MAX AT (60000)
3 INTO (
4 PARTITION p6,
5 PARTITION P_MAX
6 );
Table altered.
SQL> select index_name, partition_name, status from user_ind_partitions where index_name = 'IDX_PART_DROP_COL2';
INDEX_NAME PARTITION_NAME STATUS
------------------------------ ------------------------------ --------
IDX_PART_DROP_COL2 P1 USABLE
IDX_PART_DROP_COL2 P2 USABLE
IDX_PART_DROP_COL2 P5 UNUSABLE
IDX_PART_DROP_COL2 P6 UNUSABLE
IDX_PART_DROP_COL2 P_MAX USABLE
SQL> select count(*) from part_tab_drop PARTITION(P5);
COUNT(*)
----------
30000
SQL> select count(*) from part_tab_drop PARTITION(P6);
COUNT(*)
----------
1
SQL> select count(*) from part_tab_drop PARTITION(P_MAX);
COUNT(*)
----------
0
SQL> alter index IDX_PART_DROP_COL2 rebuild;
alter index IDX_PART_DROP_COL2 rebuild
*
ERROR at line 1:
ORA-14086: a partitioned index may not be rebuilt as a whole
SQL> ALTER INDEX IDX_PART_DROP_COL2 REBUILD PARTITION p5;
Index altered.
SQL> ALTER INDEX IDX_PART_DROP_COL2 REBUILD PARTITION p6;
Index altered.
SQL> select index_name, partition_name, status from user_ind_partitions where index_name = 'IDX_PART_DROP_COL2';
INDEX_NAME PARTITION_NAME STATUS
------------------------------ ------------------------------ --------
IDX_PART_DROP_COL2 P1 USABLE
IDX_PART_DROP_COL2 P2 USABLE
IDX_PART_DROP_COL2 P5 USABLE
IDX_PART_DROP_COL2 P6 USABLE
IDX_PART_DROP_COL2 P_MAX USABLE
SQL> ALTER TABLE part_tab_drop MERGE PARTITIONS p5, p6,P_MAX INTO PARTITION P_MAX;
ALTER TABLE part_tab_drop MERGE PARTITIONS p5, p6,P_MAX INTO PARTITION P_MAX
*
ERROR at line 1:
ORA-14126: only a <parallel clause> may follow description(s) of resulting
partitions
SQL> ALTER TABLE part_tab_drop MERGE PARTITIONS p6,P_MAX INTO PARTITION P_MAX;
Table altered.
SQL> select index_name, partition_name, status from user_ind_partitions where index_name = 'IDX_PART_DROP_COL2';
INDEX_NAME PARTITION_NAME STATUS
------------------------------ ------------------------------ --------
IDX_PART_DROP_COL2 P1 USABLE
IDX_PART_DROP_COL2 P2 USABLE
IDX_PART_DROP_COL2 P5 USABLE
IDX_PART_DROP_COL2 P_MAX UNUSABLE
SQL> ALTER TABLE part_tab_drop MERGE PARTITIONS p5,P_MAX INTO PARTITION P_MAX;
Table altered.
SQL> select index_name, partition_name, status from user_ind_partitions where index_name = 'IDX_PART_DROP_COL2';
INDEX_NAME PARTITION_NAME STATUS
------------------------------ ------------------------------ --------
IDX_PART_DROP_COL2 P1 USABLE
IDX_PART_DROP_COL2 P2 USABLE
IDX_PART_DROP_COL2 P_MAX UNUSABLE
SQL> ALTER INDEX IDX_PART_DROP_COL2 REBUILD PARTITION p_max;
Index altered.
SQL> select count(*) from part_tab_drop PARTITION(P_MAX);
COUNT(*)
----------
30001
SQL> select max(id) from part_tab_drop PARTITION(P_MAX);
MAX(ID)
----------
50000
SQL>
SQL>
SQL>
SQL> ALTER TABLE part_tab_drop
2 SPLIT PARTITION p3 AT (50001)
3 INTO (
4 PARTITION p5,
5 PARTITION P_MAX
6 );
SPLIT PARTITION p3 AT (50001)
*
ERROR at line 2:
ORA-02149: Specified partition does not exist
SQL> select index_name, partition_name, status from user_ind_partitions where index_name = 'IDX_PART_DROP_COL2';
INDEX_NAME PARTITION_NAME STATUS
------------------------------ ------------------------------ --------
IDX_PART_DROP_COL2 P1 USABLE
IDX_PART_DROP_COL2 P2 USABLE
IDX_PART_DROP_COL2 P_MAX USABLE
SQL>
SQL>
SQL> ALTER TABLE part_tab_drop
2 SPLIT PARTITION P_MAX AT (50001)
3 INTO (
4 PARTITION p5,
5 PARTITION P_MAX
6 );
Table altered.
SQL> select index_name, partition_name, status from user_ind_partitions where index_name = 'IDX_PART_DROP_COL2';
INDEX_NAME PARTITION_NAME STATUS
------------------------------ ------------------------------ --------
IDX_PART_DROP_COL2 P1 USABLE
IDX_PART_DROP_COL2 P2 USABLE
IDX_PART_DROP_COL2 P5 USABLE
IDX_PART_DROP_COL2 P_MAX USABLE
SQL>
相关参考:
更多推荐
所有评论(0)