分区表信息整理 for10g

来源:互联网 发布:侠客风云传低配优化 编辑:程序博客网 时间:2024/06/16 19:47
 

oracle分区表资料整理
这里只是介绍oracle10r2的分区表资料,不包含11g的新特性。
一:分区表类型及介绍


Range(范围)分区
Range分区呢是应用范围比较广的表分区方式,它是以列的值的范围来做为分区的划分条件,将记录存放到列值所在的range分区中,比如按照时间范围划分,按照数字范围划分之类,因此在创建的时候需要指定基于的列,以及分区的范围值,如果某些记录暂无法预测范围,可以创建maxvalue分区,所有不在指定范围内的记录都会被存储到maxvalue所在分区中,并且支持指定多列做为依赖列。

Hash(哈希)分区
对于那些无法有效划分范围的表,可以使用hash分区,这样对于提高性能还是会有一定的帮助。hash分区会将表中的数据平均分配到你指定的几个分区中,列所在分区是依据分区列的hash值自动分配,因此你并不能控制也不知道哪条记录会被放到哪个分区中,hash分区也可以支持多个依赖列。

List(列表)分区
List分区与range分区和hash分区都有类似之处,该分区与range分区类似的是也需要你指定列的值,但这又不同与range分区的范围式列值---其分区值必须明确指定,也不同与hash分区---通过明确指定分区值,你能控制记录存储在哪个分区。它的分区列只能有一个,而不能像range或者hash分区那样同时指定多个列做为分区依赖列,不过它的单个分区对应值可以是多个。在分区时必须确定分区列可能存在的值,一旦插入的列值不在分区范围内,则插入/更新就会失败,因此通常建议使用list分区时,要创建一个default分区存储那些不在指定范围内的记录,类似range分区中的maxvalue分区。

组合分区:Range-Hash,Range-List
如果某表按照某列分区之后,仍然较大,或者是一些其它的需求,还可以通过分区内再建子分区的方式将分区再分区,即组合分区的方式。组合分区在10g中有两种:range-hash,range-list。这里必须注意顺序,根分区只能是range分区,子分区可以是hash分区或list分区。

对于一般的非索引的堆表而言,上述分区形式都可以应用,但是分区依赖列不能是lob,long之类数据类型,每个表的分区或子分区数的总数不能超过1023个。对于索引组织表,只能够支持普通分区方式,不支持组合分区,常规表的限制对于索引组织表同样有效,除此之外呢,还有一些其实的限制,比如要求索引组织表的分区依赖列必须是主键才可以等。
Oracle建议如果单个表超过2G就最好对其进行分区


二:分区表建立
对某个表做分区,必须在创建表时就指定分区,不能直接将一个未分区的表修改成分区表(在线重定义也是借助临时表间接实现)。
1、创建range分区
创建该类分区表时我们需要指定的关键字:
column:分区依赖列(如果是多个,以逗号分隔);
partition:分区名称;
values less than:后跟分区范围值(如果依赖列有多个,范围对应值也应是多个,中间以逗号分隔);
tablespace_clause:分区的存储属性,例如所在表空间等属性(可为空),默认继承基表所在表空间的属性。
创建范例一(数字范围的):
create table test1 (vl1 number,vl2 varchar2(10))
    partition by range(vl1)(
    partition test1_p1 values less than (100000) tablespace ts_client_use,
    partition test1_p2 values less than (200000) tablespace ts_client_use,
    partition test1_p3 values less than (300000) tablespace ts_client_use,
    partition test1_pmax values less than (maxvalue) tablespace ts_client_use
    );


创建范例二(日期的):
create table test2
(
  UP_DATE   DATE,
  V_ID VARCHAR2(32)
)
partition by range (UP_DATE)
(
  partition test2_p1 values less than (TO_DATE(' 2011-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')) tablespace ts_client_use,
  partition test2_p2 values less than (TO_DATE(' 2011-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')) tablespace ts_client_use,
  partition test2_p3 values less than (maxvalue) tablespace ts_client_use
);

 

创建范例三(混合多列的);
create table test3
(
  vl1 number,
  UP_DATE   DATE,
  V_ID VARCHAR2(32)
)
partition by range (vl1,UP_DATE)
(
  partition test3_p1 values less than (100000,TO_DATE(' 2011-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')) tablespace ts_client_use,
  partition test3_p2 values less than (200000,TO_DATE(' 2011-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')) tablespace ts_client_use,
  partition test3_p3 values less than (maxvalue,maxvalue) tablespace ts_client_use
);


2、创建hash分区
创建范例一(一般的):
create table test4 (vl1 number,vl2 varchar2(100))
partition by hash(vl1)(
partition test4_p1 tablespace TS_CLIENT_USE,
partition test4_p2 tablespace TS_CLIENT_USE,
partition test4_p3 tablespace TS_CLIENT_USE);


创建范例二(指定分区数量和表空间,分区名称系统自行指定):
create table test5 (vl1 number,vl2 varchar2(100))
partition by hash(vl1)
 partitions 3 store in(TS_CLIENT_USE,TS_CLIENT_USE,TS_CLIENT_USE);


这样创建过后查看如下:
-- Create table
create table TEST5
(
  VL1 NUMBER,
  VL2 VARCHAR2(100)
)
partition by hash (VL1)
(
  partition SYS_P21
    tablespace TS_CLIENT_USE,
  partition SYS_P22
    tablespace TS_CLIENT_USE,
  partition SYS_P23
    tablespace TS_CLIENT_USE
);

 

3、创建list分区
create table test6 (vl1 varchar2(10),vl2 varchar2(50))
partition by list(vl1)(
partition test6_p1 values ('HOUR','MIN','SECOND') tablespace TS_CLIENT_USE,
partition test6_p2 values ('DAY','MONTH','YEAR') tablespace TS_CLIENT_USE,
partition test6_pd values (default) tablespace TS_CLIENT_USE);


4、range-hash组合分区
这里注意一盒顺序问题,是先range再hash,不能先hash再range之类的
创建范例一(省事的):
create table test7 (vl1 number,vl2 varchar2(50))
    partition by range(vl1) subpartition by hash(vl2)
    subpartitions 4 store in (TS_CLIENT_USE, TS_CLIENT_USE, TS_CLIENT_USE,TS_CLIENT_USE)(
    partition test7_r_p1 values less than (100000) tablespace TS_CLIENT_USE,
    partition test7_r_p2 values less than (200000) tablespace TS_CLIENT_USE,
    partition test7_r_p3 values less than (300000) tablespace TS_CLIENT_USE,
    partition test7_r_max values less than (maxvalue) tablespace TS_CLIENT_USE);

这里要注意与最后一个括号对应的括号,这两个括号框定hash的分区
创建完毕后提取建表语句如下,hash的分区系统自行命名了:
-- Create table
create table TEST7
(
  VL1 NUMBER,
  VL2 VARCHAR2(50)
)
partition by range (VL1)
subpartition by hash (VL2)
(
  partition TEST7_R_P1 values less than (100000)
    tablespace TS_CLIENT_USE
    pctfree 10
    initrans 1
    maxtrans 255
  (
    subpartition SYS_SUBP27 tablespace TS_CLIENT_USE,
    subpartition SYS_SUBP28 tablespace TS_CLIENT_USE,
    subpartition SYS_SUBP29 tablespace TS_CLIENT_USE,
    subpartition SYS_SUBP30 tablespace TS_CLIENT_USE
  ),
  partition TEST7_R_P2 values less than (200000)
    tablespace TS_CLIENT_USE
    pctfree 10
    initrans 1
    maxtrans 255
  (
    subpartition SYS_SUBP31 tablespace TS_CLIENT_USE,
    subpartition SYS_SUBP32 tablespace TS_CLIENT_USE,
    subpartition SYS_SUBP33 tablespace TS_CLIENT_USE,
    subpartition SYS_SUBP34 tablespace TS_CLIENT_USE
  ),
  partition TEST7_R_P3 values less than (300000)
    tablespace TS_CLIENT_USE
    pctfree 10
    initrans 1
    maxtrans 255
  (
    subpartition SYS_SUBP35 tablespace TS_CLIENT_USE,
    subpartition SYS_SUBP36 tablespace TS_CLIENT_USE,
    subpartition SYS_SUBP37 tablespace TS_CLIENT_USE,
    subpartition SYS_SUBP38 tablespace TS_CLIENT_USE
  ),
  partition TEST7_R_MAX values less than (MAXVALUE)
    tablespace TS_CLIENT_USE
    pctfree 10
    initrans 1
    maxtrans 255
  (
    subpartition SYS_SUBP39 tablespace TS_CLIENT_USE,
    subpartition SYS_SUBP40 tablespace TS_CLIENT_USE,
    subpartition SYS_SUBP41 tablespace TS_CLIENT_USE,
    subpartition SYS_SUBP42 tablespace TS_CLIENT_USE
  )
);

 

对分区创建hash子分区范例:
其实也就是上面括号范围变化使用罢了
create table test8 (vl1 number,vl2 varchar2(50))
    partition by range(vl1) subpartition by hash(vl2)(
    partition test8_r_p1 values less than (100000) tablespace TS_CLIENT_USE,
    partition test8_r_p2 values less than (200000) tablespace TS_CLIENT_USE,
    partition test8_r_p3 values less than (300000) tablespace TS_CLIENT_USE
    (subpartition test8_r_p3_h1 tablespace TS_CLIENT_USE,
     subpartition test8_r_p3_h2 tablespace TS_CLIENT_USE,
     subpartition test8_r_p3_h3 tablespace TS_CLIENT_USE),
    partition test8_r_max values less than (maxvalue) tablespace TS_CLIENT_USE);

 

提取详细信息后可以看出括号的应用范围只作用到了分区3,呵呵,另能看出未显式指定子分区的分区,系统会自动创建一个子分区:
-- Create table
create table TEST8
(
  VL1 NUMBER,
  VL2 VARCHAR2(50)
)
partition by range (VL1)
subpartition by hash (VL2)
(
  partition TEST8_R_P1 values less than (100000)
    tablespace TS_CLIENT_USE
    pctfree 10
    initrans 1
    maxtrans 255
  (
    subpartition SYS_SUBP43 tablespace TS_CLIENT_USE
  ),
  partition TEST8_R_P2 values less than (200000)
    tablespace TS_CLIENT_USE
    pctfree 10
    initrans 1
    maxtrans 255
  (
    subpartition SYS_SUBP44 tablespace TS_CLIENT_USE
  ),
  partition TEST8_R_P3 values less than (300000)
    tablespace TS_CLIENT_USE
    pctfree 10
    initrans 1
    maxtrans 255
  (
    subpartition TEST8_R_P3_H1 tablespace TS_CLIENT_USE,
    subpartition TEST8_R_P3_H2 tablespace TS_CLIENT_USE,
    subpartition TEST8_R_P3_H3 tablespace TS_CLIENT_USE
  ),
  partition TEST8_R_MAX values less than (MAXVALUE)
    tablespace TS_CLIENT_USE
    pctfree 10
    initrans 1
    maxtrans 255
  (
    subpartition SYS_SUBP45 tablespace TS_CLIENT_USE
  )
);

 

使用模板创建分区示例:
其实这个我觉得用处不是很大(纯个人观点,呵呵):
区模板的功能,在指定子分区信赖列之后,制订子分区的存储模板,各个分区即会按照子分区模式创建子分区
create table test9 (vl1 number,vl2 varchar2(50))
    partition by range(vl1) subpartition by hash(vl2)
    subpartition template (
     subpartition p1 tablespace TS_PPS_CLIENT_USE,
     subpartition p2 tablespace TS_PPS_CLIENT_USE,
     subpartition p3 tablespace TS_PPS_CLIENT_USE,
     subpartition p4 tablespace TS_PPS_CLIENT_USE)(
    partition test9_r_p1 values less than (100000) tablespace TS_PPS_CLIENT_USE,
    partition test9_r_p2 values less than (200000) tablespace TS_PPS_CLIENT_USE,
    partition test9_r_p3 values less than (300000) tablespace TS_PPS_CLIENT_USE,
    partition test9_r_max values less than (maxvalue) tablespace TS_PPS_CLIENT_USE);
   
建立完毕后查看具体脚本如下,感觉上似乎和一般建立方法没啥区别。。。:
-- Create table
create table TEST9
(
  VL1 NUMBER,
  VL2 VARCHAR2(50)
)
partition by range (VL1)
subpartition by hash (VL2)
(
  partition TEST9_R_P1 values less than (100000)
    tablespace TS_PPS_CLIENT_USE
    pctfree 10
    initrans 1
    maxtrans 255
  (
    subpartition TEST9_R_P1_P1 tablespace TS_PPS_CLIENT_USE,
    subpartition TEST9_R_P1_P2 tablespace TS_PPS_CLIENT_USE,
    subpartition TEST9_R_P1_P3 tablespace TS_PPS_CLIENT_USE,
    subpartition TEST9_R_P1_P4 tablespace TS_PPS_CLIENT_USE
  ),
  partition TEST9_R_P2 values less than (200000)
    tablespace TS_PPS_CLIENT_USE
    pctfree 10
    initrans 1
    maxtrans 255
  (
    subpartition TEST9_R_P2_P1 tablespace TS_PPS_CLIENT_USE,
    subpartition TEST9_R_P2_P2 tablespace TS_PPS_CLIENT_USE,
    subpartition TEST9_R_P2_P3 tablespace TS_PPS_CLIENT_USE,
    subpartition TEST9_R_P2_P4 tablespace TS_PPS_CLIENT_USE
  ),
  partition TEST9_R_P3 values less than (300000)
    tablespace TS_PPS_CLIENT_USE
    pctfree 10
    initrans 1
    maxtrans 255
  (
    subpartition TEST9_R_P3_P1 tablespace TS_PPS_CLIENT_USE,
    subpartition TEST9_R_P3_P2 tablespace TS_PPS_CLIENT_USE,
    subpartition TEST9_R_P3_P3 tablespace TS_PPS_CLIENT_USE,
    subpartition TEST9_R_P3_P4 tablespace TS_PPS_CLIENT_USE
  ),
  partition TEST9_R_MAX values less than (MAXVALUE)
    tablespace TS_PPS_CLIENT_USE
    pctfree 10
    initrans 1
    maxtrans 255
  (
    subpartition TEST9_R_MAX_P1 tablespace TS_PPS_CLIENT_USE,
    subpartition TEST9_R_MAX_P2 tablespace TS_PPS_CLIENT_USE,
    subpartition TEST9_R_MAX_P3 tablespace TS_PPS_CLIENT_USE,
    subpartition TEST9_R_MAX_P4 tablespace TS_PPS_CLIENT_USE
  )
);   

 

5、range-list组合分区
这个玩意和上面的hash大差不差,这边抄个模板建立法
测试用例:
create table test10 (vl1 number,vl2 varchar2(50))
    partition by range(vl1) subpartition by list(vl2)
    subpartition template (
     subpartition l1 values ('aa') tablespace TS_PPS_CLIENT_USE,
     subpartition l2 values ('bb') tablespace TS_PPS_CLIENT_USE,
     subpartition l3 values ('cc') tablespace TS_PPS_CLIENT_USE,
     subpartition l4 values ('dd') tablespace TS_PPS_CLIENT_USE)(
    partition test10_r_p1 values less than (100000) tablespace TS_PPS_CLIENT_USE,
    partition test10_r_p2 values less than (200000) tablespace TS_PPS_CLIENT_USE,
    partition test10_r_p3 values less than (300000) tablespace TS_PPS_CLIENT_USE,
    partition test10_r_pd values less than (maxvalue) tablespace TS_PPS_CLIENT_USE);
   
查看提取建表语句:
-- Create table
create table TEST10
(
  VL1 NUMBER,
  VL2 VARCHAR2(50)
)
partition by range (VL1)
subpartition by list (VL2)
(
  partition TEST10_R_P1 values less than (100000)
    tablespace TS_PPS_CLIENT_USE
    pctfree 10
    initrans 1
    maxtrans 255
  (
    subpartition TEST10_R_P1_L1 values ('aa') tablespace TS_PPS_CLIENT_USE,
    subpartition TEST10_R_P1_L2 values ('bb') tablespace TS_PPS_CLIENT_USE,
    subpartition TEST10_R_P1_L3 values ('cc') tablespace TS_PPS_CLIENT_USE,
    subpartition TEST10_R_P1_L4 values ('dd') tablespace TS_PPS_CLIENT_USE
  ),
  partition TEST10_R_P2 values less than (200000)
    tablespace TS_PPS_CLIENT_USE
    pctfree 10
    initrans 1
    maxtrans 255
  (
    subpartition TEST10_R_P2_L1 values ('aa') tablespace TS_PPS_CLIENT_USE,
    subpartition TEST10_R_P2_L2 values ('bb') tablespace TS_PPS_CLIENT_USE,
    subpartition TEST10_R_P2_L3 values ('cc') tablespace TS_PPS_CLIENT_USE,
    subpartition TEST10_R_P2_L4 values ('dd') tablespace TS_PPS_CLIENT_USE
  ),
  partition TEST10_R_P3 values less than (300000)
    tablespace TS_PPS_CLIENT_USE
    pctfree 10
    initrans 1
    maxtrans 255
  (
    subpartition TEST10_R_P3_L1 values ('aa') tablespace TS_PPS_CLIENT_USE,
    subpartition TEST10_R_P3_L2 values ('bb') tablespace TS_PPS_CLIENT_USE,
    subpartition TEST10_R_P3_L3 values ('cc') tablespace TS_PPS_CLIENT_USE,
    subpartition TEST10_R_P3_L4 values ('dd') tablespace TS_PPS_CLIENT_USE
  ),
  partition TEST10_R_PD values less than (MAXVALUE)
    tablespace TS_PPS_CLIENT_USE
    pctfree 10
    initrans 1
    maxtrans 255
  (
    subpartition TEST10_R_PD_L1 values ('aa') tablespace TS_PPS_CLIENT_USE,
    subpartition TEST10_R_PD_L2 values ('bb') tablespace TS_PPS_CLIENT_USE,
    subpartition TEST10_R_PD_L3 values ('cc') tablespace TS_PPS_CLIENT_USE,
    subpartition TEST10_R_PD_L4 values ('dd') tablespace TS_PPS_CLIENT_USE
  )
);
   

三:分区索引说明及创建

对于分区表的索引来说,分为全局索引和本地索引:
全局索引(global index):即可以分区,也可以不分区。即可以建range分区,也可以建hash分区,即可建于分区表,又可创建于非分区表上,就是说,全局索引是完全独立的,因此它也需要我们更多的维护操作,这里要注意的是对于global索引分区而言,在10g中只能支持range分区和hash分区。
本地索引(local index):其分区形式与表的分区完全相同,依赖列相同,存储属性也相同。对于本地索引,其索引分区的维护自动进行,就是说你add/drop/split/truncate表的分区时,本地索引会自动维护其索引分区。

创建范例一(global索引range分区):
create index test1_idx1 on test1(vl1)
    global partition by range(vl1)(
    partition test1_i1 values less than (100000) tablespace ts_client_use,
    partition test1_i2 values less than (200000) tablespace ts_client_use,
    partition test1_i3 values less than (300000) tablespace ts_client_use,
    partition test1_imax values less than (maxvalue) tablespace ts_client_use);
   
创建范例二(global索引list分区):   
这个不能global。。list的只能local索引,global出来的只是一般的b树索引
创建范例三(global索引hash分区):
create index test4_IDX on test4(vl1)
global partition by hash(vl1)
partitions 3 store in(TS_PPS_CLIENT_USE,TS_PPS_CLIENT_USE,TS_PPS_CLIENT_USE);

创建范例四(单global索引):
create index test1_idx1 on test1(vl1)  global;
其实这就是一般表使用的B树索引,好像。。。。

创建范例五(local索引);
create index test2_idx1 on test2(UP_DATE) local;
当然你可以定义下local索引的一些属性,例如
local(partition test2_p1 tablespace system,partition test2_p2 tablespace ***)


四:分区表的管理
要查询创建分区的信息,可以通过查询user_part_tables,user_tab_partitions两个数据字典
查询索引的分区信息可以通过user_part_indexes、user_ind_partitions两个数据字典

一些管理原则,抄个别人整理好的:
分区的:
分区表                     Range  List    Hash  Range-Hash     Range-List    是否带来IO操作                
增加分区                 支持      支持    支持    支持                   支持                 除hash外,均大量IO              
收缩分区                  /            /           支持    分区:/               /                       是
                                                                       子分区:支持           
删除分区                  支持    支持      /          分区:支持       支持                 无
                                                                       子分区:/                                         
交换分区                  支持    支持     支持    支持                   支持                 无           
合并分区                  支持    支持      /          分区:支持       支持                 是
                                                                       子分区:/             
修改默认属性          支持    支持     支持     支持                  支持                 无
修改分区当前属性 支持    支持     支持     支持                  支持                 无
List分区增加值        /          支持      /            /                        分区:/            无
                                                                                                  子分区:支持
List分区删除值       /          支持       /           /                         分区:/            单纯删除操作无但可能
                                                                                                  子分区:支持  之前的准备一定量的IO
修改子分区模板     /           /             /            支持                  支持                 无      
移动分区                支持    支持       支持     分区:支持     分区:支持      有
                                                                        子分区:/        子分区:/
重命名分区            支持    支持       支持     支持                 支持                  无
分隔分区                支持    支持        /           分区:支持     支持                  有
                                                                        子分区:/
截断分区                支持    支持       支持     支持                 支持                  无
 
 
分区索引的
分区索引                            索引类型  Range   List   Hash   组合分区 是否带来IO操作                
增加分区                            全局           /              /        支持      /                是
                                            本地           /              /         /            /
删除分区                            全局           支持       /         /            /                无
                                            本地           /              /         /            /
修改默认属性                    全局           支持       /         /            /                无
                                            本地           支持      支持 支持     支持          无
修改分区当前属性            全局           支持       /         /            /                无
                                            本地           支持      支持 支持     支持          无
重编译分区                        全局           支持      /         /             /                有
                                            本地           支持      支持 支持     支持          有
重命名分区                        全局           支持      /         /             /                无
                                            本地           支持      支持 支持     支持          无
分隔分区                            全局           支持      /         /            /                 有
                                            本地           /             /         /            /
 
全局分区索引(global)的一些失效说明:
ADD PARTITION | SUBPARTITION    
COALESCE PARTITION | SUBPARTITION
DROP PARTITION | SUBPARTITION   
EXCHANGE PARTITION | SUBPARTITION
MERGE PARTITION | SUBPARTITION  
MOVE PARTITION | SUBPARTITION   
SPLIT PARTITION | SUBPARTITION  
TRUNCATE PARTITION | SUBPARTITION
以上的操作都会导致全局分区索引失效,需要执行后重建索引或者在执行这些语句时加后缀update indexes。


1,增加表分区(add partition)
这里需要注意的是对于list和range来说,如果指定了default或maxvalue,则不能增加表分区,只能够以分裂表分区的方式得到新的分区。对于hash分区来说可以直接进行新增,新增后会把以前分区中的部分数据迁移至新的分区。
范例一(list):
建表
create table testa (vl1 varchar2(10),vl2 varchar2(50))
partition by list(vl1)(
partition testa_p1 values ('HOUR','MIN','SECOND'));
添加list分区
alter table testa   add partition testa_p2 values ('DAY','MONTH','YEAR');
添加default分区
alter table testa   add partition testa_pd values (default);

范例二(range):
建表
create table testb
(
  UP_DATE   DATE,
  V_ID VARCHAR2(32)
)
partition by range (UP_DATE)
(
  partition testb_p1 values less than (TO_DATE(' 2011-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'))
);
添加range分区
alter table testb   add partition testb_p2 values less than (TO_DATE(' 2011-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'));
添加maxvalue分区
alter table testb   add partition testb_p3 values less than (maxvalue);
范例三(hash):
建表
create table testc (vl1 number,vl2 varchar2(100))
partition by hash(vl1)(
partition testc_p1,
partition testc_p2 ,
partition testc_p3 );
添加hash分区
alter table testc   add partition testc_p4 ;

2,收缩表分区(coalesce partitions)
这个玩意只是针对hash的分区或子分区的,因为对于hash来说不能执行drop partition,执行一遍消失一个分区,使用上例的testc,提取语句:
-- Create table
create table TESTC
(
  VL1 NUMBER,
  VL2 VARCHAR2(100)
)
partition by hash (VL1)
(
  partition TESTC_P1
    tablespace TS_CLIENT_USE,
  partition TESTC_P2
    tablespace TS_CLIENT_USE,
  partition TESTC_P3
    tablespace TS_CLIENT_USE,
  partition TESTC_P4
    tablespace TS_CLIENT_USE
);

执行如下语句:
alter table testc coalesce partition;

再查看提取语句:
-- Create table
create table TESTC
(
  VL1 NUMBER,
  VL2 VARCHAR2(100)
)
partition by hash (VL1)
(
  partition TESTC_P1
    tablespace TS_PPS_CLIENT_USE,
  partition TESTC_P2
    tablespace TS_PPS_CLIENT_USE,
  partition TESTC_P3
    tablespace TS_PPS_CLIENT_USE
);
少了一个分区,不过这里需要注意的是如果只剩一个分区的时候再执行这个语句是会报错的。

3,删除表分区(drop partition)
这个对hash分区子分区来说不顶用的,只是针对hash之外的分区,这里需要注意一点,这个删除可是物理删除了,一删是连数据都删了的,如果要保留数据,必须使用merge partition了。
删除示例:
alter table TESTA drop partition TESTA_PD;
这个都这样的,没啥好说的,唯一要注意的是全局索引的问题罢了。

4,交换分区(exchange partition)
这个其实在做数据迁移的时候比较有用,把分区交换给一个独立的表,再对单独的表进行迁移。对于数据量很大和数据表空间设置独立时还可以通过迁移表空间的方式到其他oracle数据库实例中。具体转换的实例可以参看
http://blog.csdn.net/yuzhenhuan01/article/details/6620853
这里只简单介绍下交换分区的语法和效果。
建个分区表:
create table TESTA
(
  VL1 VARCHAR2(10),
  VL2 VARCHAR2(50)
)
partition by list (VL1)
(
  partition TESTA_P1 values ('HOUR', 'MIN', 'SECOND'),
  partition TESTA_P2 values ('DAY', 'MONTH', 'YEAR')
);
插入数据
VL1           VL2
HOUR       1
MIN            2
SECOND  3
DAY            4
MONTH     5
YEAR         6

查询分区数据
SQL> select * from TESTA partition (TESTA_P2);
 
VL1        VL2
---------- -------------
DAY             4
MONTH      5
YEAR          6

我们来交换这个分区
新建中间表,表结构和分区表保持一致
create table TESTA_PL
(
  VL1 VARCHAR2(10),
  VL2 VARCHAR2(50)
)
执行交换分区语句:
alter table TESTA exchange partition TESTA_P2 with table TESTA_PL;

再查看该分区数据:
SQL> select * from TESTA partition (TESTA_P2);
 
VL1        VL2
---------- -------------

数据已经没有了,这时查看中间表数据:
SQL> select * from TESTA_PL;
 
VL1        VL2
---------- ------------
DAY            4
MONTH      5
YEAR          6

由上可见数据已经交换到中间表了。
当然我们也可以把数据交换回来,交换回来前再插几条数据到中间表中:
VL1               VL2
DAY               4
MONTH        5
YEAR            6
DAY              44
MONTH       55
YEAR           66

执行交换分区语句:
alter table TESTA exchange partition TESTA_P2 with table TESTA_PL;

再查看数据状况:
SQL> select * from TESTA partition (TESTA_P2);
 
VL1        VL2
---------- ----------
DAY             4
MONTH      5
YEAR          6
DAY             44
MONTH      55
YEAR          66
 
6 rows selected
 
SQL> select * from TESTA_PL;
 
VL1        VL2
---------- ----------

中间表已经没有数据了。

转换分区还有个参数without validation,表示不再验证数据有效性。可以这样理解,如果中间表中含有不符合分区表list或range范围的值,如果不加该子句,则会报错,加了后可以转换过去,虽然数据异常。

5,合并表分区(merge partition)
同样不适用于hash分区和子分区,对于range分区来说必须是连续的才行,list分区没有什么说法。
还是拿上面的分区表来测试:
alter table TESTA merge partitions TESTA_P1,TESTA_P2 into partition TESTA_P1;
执行后查看表状况:
create table TESTA
(
  VL1 VARCHAR2(10),
  VL2 VARCHAR2(50)
)
partition by list (VL1)
(
  partition TESTA_P1 values ('DAY', 'MONTH', 'YEAR', 'HOUR', 'MIN', 'SECOND')
);

就剩一个表分区了且list值合并了。
合并时的注意事项比较重要,这玩意会带来大量的io,如果是生产库且数据量很大,还是悠着点使用为好,或是曲线救国实现最好。

6,修改list表分区
这个是只针对list的一项管理命令,主要是为list添加和删除list值。这里要注意的是增加list值时,该值不能存在于其他分区中,删除list值时要确认该list值是在该分区中,且删除后数据也都被删除了。
增加list值:
Alter table TESTA modify partition TESTA_P1 add values ('H','M','S');
删除list值:
Alter table TESTA modify partition TESTA_P1 drop values ('HOUR', 'MIN', 'SECOND');


7,分隔分区(Split Partition)
这个和合并表分区的功能相反,合并把两个变一个,这个是把一个变两个。同样,这个玩意也不是给hash分区用的。同样需要注意的是对数据量较大时还是悠着点用。
其实这个使用的最多的还是在split maxvalue/default的分区上,一般很少去分割非这种情况的分区。对于range和list来说split语句是不同的,不能共用一个语法。
对于range:
alter table testb split partition TESTB_P1 at (TO_DATE(' 2011-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
 into (partition TESTB_P0 tablespace ××× , partition TESTB_P1  tablespace ×××);
这个的意思就是从6月1日开始截断,把前面的放到分区0中,后面的放到分区1中。
 
对于list:
alter table TESTA split partition TESTA_P1 values ('HOUR') into (partition TESTA_P0tablespace ××× ,partition TESTA_P1 tablespace ××× );
这个的意思就是把位HOUR的值全放到分区0中,其他的还是放在分区1中。

8,截断表分区(truncate partition)
这个没啥好说的了,太常用了,直接出语句:
alter table TESTA truncate partition TESTA_P1 ;

9,移动表分区(Move Partition)
这个玩意主要用来迁移分区的表空间。。。
alter table TESTA move partition TESTA_P1 tablespace system;

local的索引也要移动

alter index TESTA_idx1 REBUILD PARTITION TESTA_P1 tablespace system;


10,重命名表分区(Rename Partition)
改名,就是改名罢了
alter table TESTA rename partition TESTA_P1 to TESTA_P11;

11,修改表分区属性和模板
修改表分区默认属性(Modify Default Attributes)
这个玩意就是修改默认值,对老的没有影响,只有新分区时如果不显示指定就按照新的默认值来了,说白了没啥用,一般都会自己去指定的:
指定默认表空间:
alter table TESTA modify default attributes tablespace system;
这个针对组合分区的:
alter table TESTA modify default attributes for partition TESTA_P1 tablespace system;

修改表子分区模板(Set Subpartition Template)
这个玩意其实也没啥用,模板之类的我是不会去用的,自己指定的来的心安啊
alter table TESTA set subpartition template(subpartition TESTA1 tablespace system,
subpartition TESTA2 tablespace system,subpartition TESTA3 tablespace system);

12,增加索引分区(Adding Index Partitions)
这个只能针对hash的global的索引,基本没啥用,反正我是没用过
alter index TESTA_IDX1 add partition TESTA_IDX1_p4 tablespace system;

13,删除索引分区(Dropping Index Partitions)
和上面是相对的,有增就有删
alter index TESTA_IDX1 drop partition TESTA_IDX1_p4;

14,重编译索引分区(Rebuilding Index Partitions)
其实就是重建下索引
alter index TESTA_IDX1 rebuild partition TESTA_IDX1_p1;

15,重命名索引分区(Renaming Index Partitions)
改名。。。
alter index TESTA_IDX1 rename partition TESTA_IDX1_p1 to TESTA_IDX1_p0;

16,分拆索引分区(Splitting Index Partitions)
就是split
alter index TESTA_IDX1 split partition TESTA_IDX1_p0 at (10000) into partition TESTA_IDX1_p0,partition TESTA_IDX1_p1);


17,修改索引分区默认属性(Modifying Default Attributes of Index Partitions)
不说了,参看前面分区表的吧


18,修改索引分区当前属性(Modifying Real Attributes of Index Partitions)
同上

 

最后的建议,分区表还是要设计好,能不大动就不要大动,不然数据量一上来,那个速度慢的。。。

原创粉丝点击