分区表学习笔记(二)--分区管理

主要内容:

1、添加新的分区

2split 分区拆分

3、合并分区Merge

4、移动分区

5Truncate分区

6drop 分区

 

----------------------------------------------------------

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                              556

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                                    ix_custaddr_id                                  p_other

icd                                    ix_custaddr_id                                  t_list551

icd                                    ix_custaddr_id                                  t_list556

分区索引自动创建了。

 

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类型的使用atList使用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                                              t_list556

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                       STATUS

------------------------------ --------

IX_CUSTADDR_ID                  N/A

-------------------------------------------------------------------     ----------------------

这里有点小疑问:这个状态是否是正常的,实验中状态如下:

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

-------------------------------------------------------------------     -----------------------

5Truncate分区

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,需要重建

 

6Drop分区

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                                               T_LIST556

CUSTADDR                                              P_OTHER  

同样会自动维护局部分区索引,同时会使全局索引unusable,需要重建

 

(本系列文章为个人的学习笔记,参考了许多前辈的文章,如DAVE等。如果侵权之嫌,请和我联系,尽快删除)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值