主要内容:
1、添加新的分区
2、split 分区拆分
3、合并分区Merge
4、移动分区
5、Truncate分区
6、drop 分区
----------------------------------------------------------
1、添加新的分区
添加新的分区有2中情况:
(1)原分区里边界是maxvalue或者default。这种情况下,我们需要把边界分区drop掉,加上新分区后,在添加上新的分区。或者采用split,对边界分区进行拆分。
(2)没有边界分区的。这种情况下,直接添加分区就可以了。
以边界分区添加新分区示例:
(1)分区表和索引的信息如下:
SQL> create table custaddr
(id varchar2(15 byte) not null,
areacode varchar2(4 byte))
partition by list (areacode)
(
partition t_list556 values ('556') tablespace data01,
partition p_other values (default)tablespace data01
);
表已创建。
SQL> create index ix_custaddr_id on custaddr(id)
local (
partition t_list556 tablespace data01,
partition p_other tablespace data01
);
索引已创建。
(2)插入几条测试数据:
SQL> insert into custaddr values('1','556');
已创建 1 行。
SQL> insert into custaddr values('2','551');
已创建 1 行。
SQL> insert into custaddr values('3','555');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from custaddr;
ID AREA
--------------- ----
1 556
2 551
3 555
SQL> select * from custaddr partition(t_list556);
ID AREA
--------------- ----
1
SQL>
(3)删除default分区
sql> alter table custaddr drop partition p_other;
表已更改。
sql> select table_name,partition_name from user_tab_partitions where table_name='CUSTADDR';
table_name partition_name
------------------------------ ------------------------------
custaddr t_list556
(4)添加新分区
SQL> alter table custaddr add partition t_list551 values('551') tablespace data01;
表已更改。
SQL> select table_name,partition_name from user_tab_partitions where
table_name='CUSTADDR';
TABLE_NAME PARTITION_NAME
------------------------------ ------------------------------
CUSTADDR T_LIST556
CUSTADDR T_LIST551
(5)添加default 分区
SQL> alter table custaddr add partition p_other values (default) tablespace data01;
表已更改。
SQL> select table_name,partition_name from user_tab_partitions where
table_name='CUSTADDR';
TABLE_NAME PARTITION_NAME
------------------------------ ------------------------------
CUSTADDR T_LIST556
CUSTADDR T_LIST551
CUSTADDR P_OTHER
(6)对于局部索引,oracle会自动增加一个局部分区索引。验证一下:
sql> select owner,index_name,table_name,partitioning_type from dba_part_indexes
where index_name='ix_custaddr_id';
owner index_name table_name
---------------------- ------------------------------ ------------------
icd ix_custaddr_id custaddr
sql> select index_owner,index_name,partition_name from dba_ind_partitions where
index_name='ix_custaddr_id';
index_owner index_name partition_name
------------------------------ ------------------------------ ------------------
icd
icd
icd
分区索引自动创建了。
2、 split 分区拆分
在上节中,我们说明了可以使用split的方式来添加分区。这里我们用split方法继续上面的实验。
sql> alter table custaddr split partition p_other values('552') into (partition t_list552
tablespace icd_service, partition p_other tablespace icd_service);
表已更改。
--注意这里红色的地方,如果是Range类型的,使用at,List使用Values。
SQL> select table_name,partition_name from user_tab_partitions where table_name='CUSTADDR';
TABLE_NAME PARTITION_NAME
------------------------------ ------------------------------
CUSTADDR T_LIST556
CUSTADDR T_LIST551
CUSTADDR T_LIST552
CUSTADDR P_OTHER
SQL> select index_owner,index_name,partition_name from dba_ind_partitions where index_name='IX_CUSTADDR_ID';
index_owner index_name partition_name
------------------------------ ------------------------------ ------------------
icd ix_custaddr_id p_other
icd ix_custaddr_id t_list551
icd ix_custaddr_id t_list552
icd ix_custaddr_id t_list556
注意:分区表会自动维护局部分区索引。全局索引会失效,需要进行rebuild。
3、合并分区Merge
相邻的分区可以merge为一个分区,新分区的下边界为原来边界值较低的分区,上边界为原来边界值较高的分区,原先的局部索引相应也会合并,全局索引会失效,需要rebuild。
SQL> alter table custaddr merge partitions t_list552,p_other into partition p_other;
表已更改。
SQL> select index_owner,index_name,partition_name from dba_ind_partitions
where index_name='IX_CUSTADDR_ID';
index_owner index_name partition_name
-------------------- ------------------------------ ------------------
icd ix_custaddr_id p_other
icd ix_custaddr_id t_list551
icd ix_custaddr_id t_list556
SQL> select table_name,partition_name from user_tab_partitions where
table_name='CUSTADDR';
table_name partition_name
------------------------------ ------------------------------
custaddr
custaddr t_list551
custaddr p_other
4、移动分区
SQL> alter table custaddr move partition P_OTHER tablespace system;
表已更改。
SQL> alter table custaddr move partition P_OTHER tablespace DATA01;
表已更改。
注意:分区移动会自动维护局部分区索引,oracle 不会自动维护全局索引,所以需要我们重新rebuild 分区索引,具体需要rebuild 哪些索引,可以通过dba_part_indexes,dba_ind_partitions去判断。
SQL> Select index_name,status From user_indexes Where table_name='CUSTADDR';
INDEX_NAME
------------------------------ --------
IX_CUSTADDR_ID
------------------------------------------------------------------- ----------------------
这里有点小疑问:这个状态是否是正常的,实验中状态如下:
SQL> select index_owner,index_name,partition_name,STATUS from dba_ind_partitions where
2 index_name='IX_CUSTADDR_ID';
INDEX_OWNER INDEX_NAME PARTITION_NAME STATUS
------------------------------ ------------------------------ ------------------------------ --------
SYS IX_CUSTADDR_ID P_OTHER UNUSABLE --可能是做了其他操作
SYS IX_CUSTADDR_ID T_LIST551 USABLE 删除分区,重新添加之后
SYS IX_CUSTADDR_ID T_LIST556 USABLE 状态正常。
SQL> Select index_name,status From user_indexes Where table_name='CUSTADDR';
INDEX_NAME STATUS
------------------------------ --------
IX_CUSTADDR_ID N/A
------------------------------------------------------------------- -----------------------
5、Truncate分区
SQL> select * from custaddr partition(T_LIST556);
ID AREA
--------------- ----
1 556
SQL> alter table custaddr truncate partition(T_LIST556);
表被截断。
SQL> select * from custaddr partition(T_LIST556);
未选定行
说明:
Truncate相对delete操作很快,数据仓库中的大量数据的批量数据加载可能会有用到;截断分区同样会自动维护局部分区索引,同时会使全局索引unusable,需要重建
6、Drop分区
SQL> alter table custaddr drop partition T_LIST551;
表已更改。
SQL> select table_name,partition_name from user_tab_partitions where
table_name='CUSTADDR';
TABLE_NAME PARTITION_NAME
------------------------------ ------------------------------
CUSTADDR
CUSTADDR P_OTHER
同样会自动维护局部分区索引,同时会使全局索引unusable,需要重建
(本系列文章为个人的学习笔记,参考了许多前辈的文章,如DAVE等。如果侵权之嫌,请和我联系,尽快删除)