一. 分区表理论知识 Oracle提供了分区技术以支持VLDB(Very Large DataBase)。分区表通过对分区列的判断,把分区列不同的记录,放到不同的分区中。分区完全对应用透明。 Oracle的分区表可以包括多个分区,每个分区都是一个独立的段(SEGMENT),可以存放到不同的表空间中。查询时可以通过查询表来访问各个分区中的数据,也可以通过在查询时直接指定分区的方法来进行查询。 When to Partition a Table什么时候需要分区表,官网的2个建议如下: (1)Tables greater than 2GB should always be considered for partitioning. (2)Tables containing historical data, in which new data is added into the newest partition. A typical example is a historical table where only the current month's data is updatable and the other 11 months are read only. 在oracle 10g中最多支持:1024k-1个分区: Tables can be partitioned into up to 1024K-1 separate partitions 联机文档上有关分区表和索引的说明: Partitioned Tables and Indexes http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/partconc.htm#sthref2604 分区提供以下优点: (1)由于将数据分散到各个分区中,减少了数据损坏的可能性; (2)可以对单独的分区进行备份和恢复; (3)可以将分区映射到不同的物理磁盘上,来分散IO; (4)提高可管理性、可用性和性能。 Oracle 10g提供了以下几种分区类型: (1)范围分区(range); (2)哈希分区(hash); (3)列表分区(list); (4)范围-哈希复合分区(range-hash); (5)范围-列表复合分区(range-list)。 Range分区: Range分区是应用范围比较广的表分区方式,它是以列的值的范围来做为分区的划分条件,将记录存放到列值所在的range分区中。 如按照时间划分,2010年1月的数据放到a分区,2月的数据放到b分区,在创建的时候,需要指定基于的列,以及分区的范围值。 在按时间分区时,如果某些记录暂无法预测范围,可以创建maxvalue分区,所有不在指定范围内的记录都会被存储到maxvalue所在分区中。 如: create table pdba (id number, time date) partition by range (time) ( partition p1 values less than (to_date('2010-10-1', 'yyyy-mm-dd')), partition p2 values less than (to_date('2010-11-1', 'yyyy-mm-dd')), partition p3 values less than (to_date('2010-12-1', 'yyyy-mm-dd')), partition p4 values less than (maxvalue) ) Hash分区: 对于那些无法有效划分范围的表,可以使用hash分区,这样对于提高性能还是会有一定的帮助。hash分区会将表中的数据平均分配到你指定的几个分区中,列所在分区是依据分区列的hash值自动分配,因此你并不能控制也不知道哪条记录会被放到哪个分区中,hash分区也可以支持多个依赖列。 如: create table test ( transaction_id number primary key, item_id number(8) not null ) partition by hash(transaction_id) ( partition part_01 tablespace tablespace01, partition part_02 tablespace tablespace02, partition part_03 tablespace tablespace03 ); 或: create table test_1 ( transaction_id number primary key, item_id number(8) not null ) partition by hash(transaction_id,item_id) ( partition part_01 tablespace DATA01, partition part_02 tablespace DATA05, partition part_03 tablespace DATA06 ); 在这里,我们指定了每个分区的表空间。 List分区: List分区也需要指定列的值,其分区值必须明确指定,该分区列只能有一个,不能像range或者hash分区那样同时指定多个列做为分区依赖列,但它的单个分区对应值可以是多个。 在分区时必须确定分区列可能存在的值,一旦插入的列值不在分区范围内,则插入/更新就会失败,因此通常建议使用list分区时,要创建一个default分区存储那些不在指定范围内的记录,类似range分区中的maxvalue分区。 在根据某字段,如城市代码分区时,可以指定default,把非分区规则的数据,全部放到这个default分区。 如: create table custaddr ( id varchar2(15 byte) not null, areacode varchar2(4 byte) ) partition by list (areacode) ( partition t_list025 values ('025'), partition t_list372 values ('372') , partition t_list510 values ('510'), partition p_other values (default) ) 组合分区: 如果某表按照某列分区之后,仍然较大,或者是一些其它的需求,还可以通过分区内再建子分区的方式将分区再分区,即组合分区的方式。 组合分区呢在10g中有两种:range-hash,range-list。注意顺序,根分区只能是range分区,子分区可以是hash分区或list分区。 如: create table test ( transaction_id number primary key, transaction_date date ) partition by range(transaction_date) subpartition by hash(transaction_id) subpartitions 3 store in (data01,data05,data06) ( partition part_01 values less than(to_date(’2014-06-01’,’yyyy-mm-dd’)), partition part_02 values less than(to_date(’2014-07-01’,’yyyy-mm-dd’)), partition part_03 values less than(maxvalue) ); create table emp_sub_template (deptno number, empname varchar(32), grade number) partition by range(deptno) subpartition by hash(empname) subpartition template (subpartition a tablespace ts1, subpartition b tablespace ts2, subpartition c tablespace ts3, subpartition d tablespace ts4 ) (partition p1 values less than (1000), partition p2 values less than (2000), partition p3 values less than (maxvalue) ); create table quarterly_regional_sales (deptno number, item_no varchar2(20), txn_date date, txn_amount number, state varchar2(2)) tablespace ts4 partition by range (txn_date) subpartition by list (state) (partition q1_1999 values less than (to_date('1-apr-1999','dd-mon-yyyy')) (subpartition q1_1999_northwest values ('or', 'wa'), subpartition q1_1999_southwest values ('az', 'ut', 'nm'), subpartition q1_1999_northeast values ('ny', 'vm', 'nj'), subpartition q1_1999_southeast values ('fl', 'ga'), subpartition q1_1999_northcentral values ('sd', 'wi'), subpartition q1_1999_southcentral values ('ok', 'tx') ), partition q2_1999 values less than ( to_date('1-jul-1999','dd-mon-yyyy')) (subpartition q2_1999_northwest values ('or', 'wa'), subpartition q2_1999_southwest values ('az', 'ut', 'nm'), subpartition q2_1999_northeast values ('ny', 'vm', 'nj'), subpartition q2_1999_southeast values ('fl', 'ga'), subpartition q2_1999_northcentral values ('sd', 'wi'), subpartition q2_1999_southcentral values ('ok', 'tx') ), partition q3_1999 values less than (to_date('1-oct-1999','dd-mon-yyyy')) (subpartition q3_1999_northwest values ('or', 'wa'), subpartition q3_1999_southwest values ('az', 'ut', 'nm'), subpartition q3_1999_northeast values ('ny', 'vm', 'nj'), subpartition q3_1999_southeast values ('fl', 'ga'), subpartition q3_1999_northcentral values ('sd', 'wi'), subpartition q3_1999_southcentral values ('ok', 'tx') ), partition q4_1999 values less than ( to_date('1-jan-2000','dd-mon-yyyy')) (subpartition q4_1999_northwest values ('or', 'wa'), subpartition q4_1999_southwest values ('az', 'ut', 'nm'), subpartition q4_1999_northeast values ('ny', 'vm', 'nj'), subpartition q4_1999_southeast values ('fl', 'ga'), subpartition q4_1999_northcentral values ('sd', 'wi'), subpartition q4_1999_southcentral values ('ok', 'tx') ) ); 在Oracle 11g中,组合分区功能这块有所增强,又增加了range-range,list-range, list-list,list-hash,并且 11g里面还支持Interval分区和虚拟列分区。 这块可以参考Blog: Oracle 11g 新特性简介 http://blog.csdn.net/tianlesoftware/archive/2010/01/06/5134819.aspx 分区表 之 Interval分区 和 虚拟列 按星期分区表 http://blog.csdn.net/tianlesoftware/archive/2010/06/10/5662337.aspx 二. 普通表转分区表方法 将普通表转换成分区表有4种方法: 1. Export/import method 2. Insert with a subquery method 3. Partition exchange method 4. DBMS_REDEFINITION 具体参考: How to Partition a Non-partitioned Table [ID 1070693.6] http://blog.csdn.net/tianlesoftware/archive/2011/03/02/6218704.aspx 逻辑导出导入这里就不做说明,我们看看其他三种方法。 |