分区索引失效的处理!

--创建范围表分区:

SQL> drop table t_partition_range;

表已删除。

SQL> create table t_partition_range (id number,name varchar2(50))  
  2  partition by range(id)( 
  3  partition t_range_p1 values less than (10) tablespace tbspart01,
  4  partition t_range_p2 values less than (20) tablespace tbspart02,
  5  partition t_range_p3 values less than (30) tablespace tbspart03,  
  6  partition t_range_pmax values less than (maxvalue) tablespace tbspart04); 

表已创建。

SQL> select TABLE_NAME,PARTITIONING_TYPE,PARTITION_COUNT from user_part_tables where TABLE_NAME = 'T_PARTITION_RANGE';

TABLE_NAME                     PARTITI PARTITION_COUNT
------------------------------ ------- ---------------
T_PARTITION_RANGE              RANGE                 4

SQL> select PARTITION_NAME,HIGH_VALUE,TABLESPACE_NAME from user_tab_partitions where TABLE_NAME = 'T_PARTITION_RANGE';

PARTITION_NAME                 HIGH_VALUE      TABLESPACE_NAME
------------------------------ --------------- ------------------------------
T_RANGE_P1                     10              TBSPART01
T_RANGE_P2                     20              TBSPART02
T_RANGE_P3                     30              TBSPART03
T_RANGE_PMAX                   MAXVALUE        TBSPART04

 

--创建全局范围索引分区:

SQL> create index idx_parti_range_id on t_partition_range(id)  
  2  global partition by range(id)(  
  3  partition i_range_p1 values less than (10) tablespace tbspart01,  
  4  partition i_range_p2 values less than (20) tablespace tbspart02,  
  5  partition i_range_p3 values less than (30) tablespace tbspart03,
  6  partition i_range_pmax values less than (maxvalue) tablespace tbspart04);  

索引已创建。

SQL> select index_name,partitioning_type,partition_count from user_part_indexes where index_name = 'IDX_PARTI_RANGE_ID';

INDEX_NAME                     PARTITI PARTITION_COUNT
------------------------------ ------- ---------------
IDX_PARTI_RANGE_ID             RANGE                 4

SQL> select PARTITION_NAME,HIGH_VALUE,TABLESPACE_NAME from user_tab_partitions where TABLE_NAME = 'T_PARTITION_RANGE'; 

PARTITION_NAME                 HIGH_VALUE      TABLESPACE_NAME
------------------------------ --------------- ------------------------------
T_RANGE_P1                     10              TBSPART01
T_RANGE_P2                     20              TBSPART02
T_RANGE_P3                     30              TBSPART03
T_RANGE_PMAX                   MAXVALUE        TBSPART04


--查看分区表的数据:

SQL> insert into t_partition_range values(1,'a');

已创建 1 行。

SQL> insert into t_partition_range values(11,'b');

已创建 1 行。

SQL> insert into t_partition_range values(21,'c');

已创建 1 行。

SQL> insert into t_partition_range values(31,'d');

已创建 1 行。

SQL> commit;

提交完成。

SQL> select * from t_partition_range;

        ID NAME
---------- --------------------------------------------------
         1 a
        11 b
        21 c
        31 d

SQL> select * from t_partition_range partition(T_RANGE_P1);

        ID NAME
---------- --------------------------------------------------
         1 a

SQL> select * from t_partition_range partition(T_RANGE_P2);

        ID NAME
---------- --------------------------------------------------
        11 b

SQL> select * from t_partition_range partition(T_RANGE_P3);

        ID NAME
---------- --------------------------------------------------
        21 c

SQL> select * from t_partition_range partition(T_RANGE_PMAX);

        ID NAME
---------- --------------------------------------------------
        31 d


--查看分区索引的状态:

SQL> select INDEX_NAME,TABLE_OWNER,TABLE_NAME,STATUS from user_indexes where INDEX_NAME = 'IDX_PARTI_RANGE_ID';

INDEX_NAME                     TABLE_OWNER                    TABLE_NAME                     STATUS
------------------------------ ------------------------------ ------------------------------ --------
IDX_PARTI_RANGE_ID             ING                            T_PARTITION_RANGE              N/A

SQL> select INDEX_NAME,STATUS from user_ind_partitions where INDEX_NAME = 'IDX_PARTI_RANGE_ID';

INDEX_NAME                     STATUS
------------------------------ --------
IDX_PARTI_RANGE_ID             USABLE
IDX_PARTI_RANGE_ID             USABLE
IDX_PARTI_RANGE_ID             USABLE
IDX_PARTI_RANGE_ID             USABLE

user_indexes.STATUS: Indicates whether a nonpartitioned index is VALID or UNUSABLE
valid:当前索引有效
unusable:索引失效
N/A :分区索引,它的status可以从user_ind_partitions中获得

 

--删除表分区:(可以看见,删除分区会删除相应分区的数据)

SQL> alter table T_PARTITION_RANGE drop partition T_RANGE_P1;

表已更改。

SQL> select PARTITION_NAME,HIGH_VALUE,TABLESPACE_NAME from user_tab_partitions where TABLE_NAME = 'T_PARTITION_RANGE';

PARTITION_NAME                 HIGH_VALUE      TABLESPACE_NAME
------------------------------ --------------- ------------------------------
T_RANGE_P2                     20              TBSPART02
T_RANGE_P3                     30              TBSPART03
T_RANGE_PMAX                   MAXVALUE        TBSPART04

SQL> select * from t_partition_range;

        ID NAME
---------- --------------------------------------------------
        11 b
        21 c
        31 d


--第二次查看索引状态:(可以看见,删除表分区以后,导致索引失效,rebuild之后又变为有效拉。)

SQL> select INDEX_NAME,partition_name,high_value,tablespace_name,status from user_ind_partitions where index_name = 'IDX_PARTI_RANGE_ID';

INDEX_NAME                     PARTITION_NAME                 HIGH_VALUE      TABLESPACE_NAME                STATUS
------------------------------ ------------------------------ --------------- ------------------------------ --------
IDX_PARTI_RANGE_ID             I_RANGE_P1                     10              TBSPART01                      UNUSABLE
IDX_PARTI_RANGE_ID             I_RANGE_P2                     20              TBSPART02                      UNUSABLE
IDX_PARTI_RANGE_ID             I_RANGE_P3                     30              TBSPART03                      UNUSABLE
IDX_PARTI_RANGE_ID             I_RANGE_PMAX                   MAXVALUE        TBSPART04                      UNUSABLE

SQL> alter index IDX_PARTI_RANGE_ID rebuild partition i_range_p1;

索引已更改。

SQL> alter index IDX_PARTI_RANGE_ID rebuild partition i_range_p2;

索引已更改。

SQL> alter index IDX_PARTI_RANGE_ID rebuild partition i_range_p3;

索引已更改。

SQL> alter index IDX_PARTI_RANGE_ID rebuild partition i_range_pmax;

索引已更改。

SQL> select INDEX_NAME,partition_name,high_value,tablespace_name,status from user_ind_partitions where index_name = 'IDX_PARTI_RANGE_ID';

INDEX_NAME                     PARTITION_NAME                 HIGH_VALUE      TABLESPACE_NAME                STATUS
------------------------------ ------------------------------ --------------- ------------------------------ --------
IDX_PARTI_RANGE_ID             I_RANGE_P1                     10              TBSPART01                      USABLE
IDX_PARTI_RANGE_ID             I_RANGE_P2                     20              TBSPART02                      USABLE
IDX_PARTI_RANGE_ID             I_RANGE_P3                     30              TBSPART03                      USABLE
IDX_PARTI_RANGE_ID             I_RANGE_PMAX                   MAXVALUE        TBSPART04                      USABLE


--删除表分区指定update indexes子句:(可以看见,指定update indexes子句索引不会失效。)

SQL> select PARTITION_NAME,HIGH_VALUE,TABLESPACE_NAME from user_tab_partitions where TABLE_NAME = 'T_PARTITION_RANGE';

PARTITION_NAME                 HIGH_VALUE      TABLESPACE_NAME
------------------------------ --------------- ------------------------------
T_RANGE_P2                     20              TBSPART02
T_RANGE_P3                     30              TBSPART03
T_RANGE_PMAX                   MAXVALUE        TBSPART04

SQL> alter table T_PARTITION_RANGE drop partition T_RANGE_P2 update indexes;

表已更改。

SQL> select PARTITION_NAME,HIGH_VALUE,TABLESPACE_NAME from user_tab_partitions where TABLE_NAME = 'T_PARTITION_RANGE';

PARTITION_NAME                 HIGH_VALUE      TABLESPACE_NAME
------------------------------ --------------- ------------------------------
T_RANGE_P3                     30              TBSPART03
T_RANGE_PMAX                   MAXVALUE        TBSPART04

SQL> select INDEX_NAME,partition_name,high_value,tablespace_name,status from user_ind_partitions where index_name = 'IDX_PARTI_RANGE_ID';

INDEX_NAME                     PARTITION_NAME                 HIGH_VALUE      TABLESPACE_NAME                STATUS
------------------------------ ------------------------------ --------------- ------------------------------ --------
IDX_PARTI_RANGE_ID             I_RANGE_P1                     10              TBSPART01                      USABLE
IDX_PARTI_RANGE_ID             I_RANGE_P2                     20              TBSPART02                      USABLE
IDX_PARTI_RANGE_ID             I_RANGE_P3                     30              TBSPART03                      USABLE
IDX_PARTI_RANGE_ID             I_RANGE_PMAX                   MAXVALUE        TBSPART04                      USABLE

你可能感兴趣的:(partition)