欢迎投稿

今日深度:

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

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


分区表学习笔记(二)--分区管理
 
主要内容:
 
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                              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类型的,使用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                                              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
 
-------------------------------------------------------------------     -----------------------
 
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                                               T_LIST556
 
CUSTADDR                                              P_OTHER  
 
同样会自动维护局部分区索引,同时会使全局索引unusable,需要重建
 
 

www.htsjk.Com true http://www.htsjk.com/oracle/21034.html NewsArticle 分区表学习笔记(二)--分区管理 分区表学习笔记(二)--分区管理 主要内容: 1、添加新的分区 2、split 分区拆分 3、合并分区Merge 4、移动分区 5、Truncate分区 6、drop 分区 --------------...
相关文章
    暂无相关文章
评论暂时关闭