--创建范围表分区:
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