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