分区表的概念

当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。

分区是指将巨型的表或索引分隔成相对较小的、可独立管理的部分。分区后的表与未分区的表在执行DML语句时没有任何区别。实际上,对表进行分区后,还可以对每个单独的分区使用CREATE或ALTER等语句进行操作。因此,对巨型表或者索引分区后,可以简化它们的管理与维护操作。

在对表进行分区时,每个分区都具有相同的逻辑属性,例如都具有相同的字段名、数据类型和约束等。不过各个分区的物理属性可以不同,它们可以位于不同的表空间中。

对表进行分区时,必须为表中的每一条记录指定所属分区。一条记录属于哪一个分区是由分区表对该记录的匹配字段决定的。分区字段可以是表中表中一个字段或多个字段的组合,在创建分区表时确定。当用户对分区表进行插入、更新或删除等操作时,Oracle会自动根据分区字段的值来选择存储的分区。

表分区的具体作用

Oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。

分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。每个分区有自己的名称,还可以选择自己的存储特性。从数据库管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有相当大的灵活性。但是,从应用程序的角度来看,分区后的表与非分区表完全相同,使用 SQL DML 命令访问分区后的表时,无需任何修改。

什么时候使用分区表

表的大小超过2GB。

表中包含历史数据,新的数据被增加都新的分区中。

分区表的优点

1、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度;

2、增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;

3、维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;

4、均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。

分区表的缺点

已经存在的表没有方法可以直接转化为分区表。

分区表的种类

1、范围分区(range)

就是根据数据库表中某一字段的值的范围来划分分区

create table graderecord(sno varchar2(10),sname varchar2(20),dormitory varchar2(3),grade int)partition by range(grade)(partition bujige values less than(60), --不及格partition jige values less than(85), --及格partition youxiu values less than(maxvalue) --优秀)
2、散列分区(hash)

散列分区是根据字段的hash值进行均匀分布,尽可能的实现各分区所散列的数据相等,通过在I/O设备上进行散列分区,可以使得分区的大小一致。创建散列分区需要使用PARTITION BY HASH子句。散列分区的主要目的是实现分区平衡。

create table graderecord(sno varchar2(10),sname varchar2(20),dormitory varchar2(3),grade int)partition by hash(sno)(partition p1,partition p2,partition p3);
3、列表分区(list)

列表分区明确指定了根据某字段的某个具体值进行分区,而不是像范围分区那样根据字段的值范围来划分的;列表分区适用于分区列的值为非数字或日期数据类型,并且分区列的取值范围较少时使用。例如,成绩表中的科目列取值较少,就可以应用列表分区。创建列表分区需要使用PARTITION BY LIST子句。进行列表分区时,需要为每个分区指定一个取值列表,分区列的取值处于同一个列表中的行将被存储到同一个分区中。

create table achievement(id number primary key,name varchar2(8),subject varchar2(10),score number)partition by list(subject)(partition Li_ke values('数学','物理','化学') tablespace xxx,partition Wen_ke values('语文','英语','历史') tablespace yyy)
4、范围-散列复合分区(range-hash)

列表分区不支持多列,但是范围分区和哈希分区支持多列。

create table achievement(id number primary key,name varchar2(8),subject varchar2(10),score number,p_sub as (substr(subject,1,1)))partition by range(score)subpartition by hash(id)subpartitions 2 store in (ccrpt,sjfx)(partition part1 values less than(60),partition part2 values less than(80),partition part3 values less than(maxvalue));

上面按SCORE列分为3个分区,然后按ID列分为两个分区。先进行范围分区,再进行散列分区时使用的是SUBPARTITION BY HASH子句。

5、范围-列表复合分区(range-list)

组合范围列表分区,就是结合范围分区应用与列表分区应用。

create table achievement(id number primary key,name varchar2(8),subject varchar2(10),score number)partition by range(score)subpartition by list(subject)(partition part1 values less than(60)(subpartition part1_1 values('Java','JSP') tablespace xxx,subpartition part1_2 values('.Net','C#') tablespace yyy)partition part2 values less than(80),(subpartition part1_1 values('Java','JSP') tablespace xxx,subpartition part1_2 values('.Net','C#') tablespace yyy)partition part3 values less than(maxvalue)(subpartition part1_1 values('Java','JSP') tablespace xxx,subpartition part1_2 values('.Net','C#') tablespace yyy));

SCORE列进行范围分区,再按SUBJECT列进行列表分区,如下:

6、虚拟列分区

虚拟列分区就是将其他列引导为虚拟的一列,并在该列上进行分区。Oracle只会保存被引导列中的源数据,不单独保存虚拟列中的数据,整个虚拟列不占内存存储空间。

可将虚拟列分区看作是范围分区、散列分区等的一种特殊形式,只不过其分区列为引导出的虚拟列。

create table achievement(id number primary key,name varchar2(8),subject varchar2(10),score number,p_sub as (substr(subject,1,1)))partition by list(p_sub)(partition part1 values('J'),partition part2 values('C'),partition part3 values(default));

上面在列achievement.subject上虚拟出列achievement.p_sub,截取列achievement.subject中的第一位的值,并在该列上进行列表分区。

7、系统分区

Oracle 11g开始支持系统分区,与之前的范围分区、散列分区和列表分区不同,系统分区不用指定分区列,也没有算法机制。它通过分区的基表把依赖表的数据平均分布,适用于不能按照范围分区、散列分区和列表分区进行分区,又想把数据均分在不同的分区中,可采用此种方式。创建系统分区需要使用PARTITION BY SYSTEM子句。需要注意的是,系统分区不能进行split拆分。

系统分区与传统分区有如下区别和联系:

传统分区表根据列值进行分区,按照一定的算法(range、hash、list)来决定分区;系统分区表不指定分区列,完全根据系统本身控制数据存储的分区。

传统分区的方式是确定了数据再进行分区;系统分区则分区是分区,数据是数据,两者没有对应关系。数据可以存放在任何一个分区里,存储分区不是由数据本身决定的,而是应用程序在插入数据时决定的。

系统分区的查询方式和传统分区一样,优先查询每个分区,尽量不进行全表扫描。

系统分区建立的时候,不能引用“as select … from”子句,因为系统无法区分数据应该放在哪个分区。当对系统分区表进行DML操作时,只有insert语句需要指明分区,其余的操作不需要。

create table achievement(id number primary key,name varchar2(8),subject varchar2(10),score number)partition by system(partition part1,partition part2,partition part3);
8、间隔分区

Oracle 11g推出的间隔分区,是针对范围分区的一种功能拓展。对连续数据类型的范围分区,如果插入的新数据值与当前分区均不匹配,间隔分区可以实现自动的分区创建,省去了DBA的手工增加(add)和拆分(split)操作。

目前的间隔分区支持的范围分区键类型只有NUMBER和DATE两种类型。

创建间隔分区需要使用PARTITION BY RANGE … INTERVAL子句。例如,创建一个分区键类型为NUMBER型的间隔分区表ACHIEVEMENT,如下:

create table achievement(id number primary key,name varchar2(8),subject varchar2(10),score number)partition by range(score) interval(10)(partition part1 values less then(60) tablespace xxx,partition part2 values less then(70) tablespace yyy);

这种情况,加入我们插入一条成绩为80,一条成绩为90的数据,也可以插入成功,但是这两条数据又没有对应的分区,此时查看数据字典USER_TAB_PARTITIONS会发现多了两个分区。

9、参考分区

对于存在外键约束的两张表,如果对主表进行分区,那么通过建立参考分区可以在子表上根据外键约束来对应主表进行分区。通过建立参考分区可以同步存在外键约束的两张表的分区方式。创建参考分区需要使用PARTITION BY REFERENCE子句。

例如,创建两个参考分区表T_PRIMARY和T_FOREIGN,如下:

create table t_primary(table_name,tablespace_name,status,constraint pk_t_primary primary key(table_name))partition by list(tablespace_name)(partition part1 values('SYSTEM'),partition part2 values('USERS'),partition part3 values('default'))as select table_name,tablespace_name,status from user_tables;create table t_foreign(table_name varchar2(100) not null,partition_name varchar2(30),subpartition_name varchar2(30),constraint fk_t_foreign key(table_name) references t_primary(table_name))partition by reference(fk_t_foreign);

对于已经存在的表,怎么实现分区

方法一:利用原表重建分区表
SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);--表已创建。 SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;--已创建6264行。SQL> COMMIT;--提交完成。SQL> CREATE TABLE T_NEW (ID, TIME) PARTITION BY RANGE (TIME)2(PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),3 PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),4 PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),5 PARTITION P4 VALUES LESS THAN (MAXVALUE))6 AS SELECT ID, TIME FROM T;--表已创建。 SQL> RENAME T TO T_OLD;--表已重命名。 SQL> RENAME T_NEW TO T;--表已重命名。 

优点:方法简单易用,由于采用DDL语句,不会产生UNDO,且只产生少量REDO,效率相对较高,而且建表完成后数据已经在分布到各个分区中了。

不足:对于数据的一致性方面还需要额外的考虑。由于几乎没有办法通过手工锁定T表的方式保证一致性,在执行CREATE TABLE语句和RENAME T_NEW TO T语句直接的修改可能会丢失,如果要保证一致性,需要在执行完语句后对数据进行检查,而这个代价是比较大的。另外在执行两个RENAME语句之间执行的对T的访问会失败。

适用于修改不频繁的表,在闲时进行操作,表的数据量不宜太大。

方法二:使用交换分区的方法
SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);--表已创建。 SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;--已创建6264行。SQL> COMMIT;--提交完成。 SQL> CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)2(PARTITION P1 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),3 PARTITION P2 VALUES LESS THAN (MAXVALUE));--表已创建。 SQL> ALTER TABLE T_NEW EXCHANGE PARTITION P1 WITH TABLE T;--表已更改。SQL> RENAME T TO T_OLD;--表已重命名。SQL> RENAME T_NEW TO T;--表已重命名。

优点:只是对数据字典中分区和表的定义进行了修改,没有数据的修改或复制,效率最高。如果对数据在分区中的分布没有进一步要求的话,实现比较简单。在执行完RENAME操作后,可以检查T_OLD中是否存在数据,如果存在的话,直接将这些数据插入到T中,可以保证对T插入的操作不会丢失。

不足:仍然存在一致性问题,交换分区之后RENAME T_NEW TO T之前,查询、更新和删除会出现错误或访问不到数据。如果要求数据分布到多个分区中,则需要进行分区的SPLIT操作,会增加操作的复杂度,效率也会降低。

适用于包含大数据量的表转到分区表中的一个分区的操作。应尽量在闲时进行操作。

方法三:利用在线重定义功能

此功能需要版本在 Oracle9i 以上。

SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);--表已创建。SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;--已创建6264行。SQL> COMMIT;--提交完成。SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T', DBMS_REDEFINITION.CONS_USE_PK);--PL/SQL 过程已成功完成。SQL> CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)2(PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),3PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),4PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),5PARTITION P4 VALUES LESS THAN (MAXVALUE));--表已创建。 SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T', 'T_NEW', -> 'ID ID, TIME TIME', DBMS_REDEFINITION.CONS_USE_PK);--PL/SQL 过程已成功完成。SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('YANGTK', 'T', 'T_NEW');--PL/SQL 过程已成功完成。

优点:保证数据的一致性,在大部分时间内,表T都可以正常进行DML操作。只在切换的瞬间锁表,具有很高的可用性。这种方法具有很强的灵活性,对各种不同的需要都能满足。而且,可以在切换前进行相应的授权并建立各种约束,可以做到切换完成后不再需要任何额外的管理操作。

不足:实现上比上面两种略显复杂。

适用于各种情况。

索引分区

索引也可以进行分区

分区类型举例

1、范围分区

建表:

create table graderecord(sno varchar2(10),sname varchar2(20),dormitory varchar2(3),grade int)partition by range(grade)(partition bujige values less than(60), --不及格partition jige values less than(85), --及格partition youxiu values less than(maxvalue) --优秀)

注意:VALUES LESS THAN子句用来指定分区的上限(不包含该上限),MAXVALUE关键字用来表示分区中可能的最大值,一般用于设置最后一个分区的上限,Oracle认为NULL值大于非NULL值,所以如果分区字段的值可以为NULL,则需要为最后一个分区使用MAXVALUE关键字。

插入数据:

insert into graderecord values('511601','魁','229',92);insert into graderecord values('511602','凯','229',62);insert into graderecord values('511603','东','229',26);insert into graderecord values('511604','亮','228',77);insert into graderecord values('511605','敬','228',47);insert into graderecord(sno,sname,dormitory) values('511606','峰','228');insert into graderecord values('511607','明','240',90);insert into graderecord values('511608','楠','240',100);insert into graderecord values('511609','涛','240',67);insert into graderecord values('511610','博','240',75);insert into graderecord values('511611','铮','240',60);

查询:

select * from graderecord;select * from graderecord partition(bujige);select * from graderecord partition(jige);select * from graderecord partition(youxiu);

说明:数据中有空值,Oracle机制会自动将其规划到maxvalue的分区中。

2、散列分区

建表:

create table graderecord(sno varchar2(10),sname varchar2(20),dormitory varchar2(3),grade int)partition by hash(sno)(partition p1,partition p2,partition p3);

插入数据,与范围分区实验插入的数据相同。

insert into graderecord values('511601','魁','229',92);insert into graderecord values('511602','凯','229',62);insert into graderecord values('511603','东','229',26);insert into graderecord values('511604','亮','228',77);insert into graderecord values('511605','敬','228',47);insert into graderecord(sno,sname,dormitory) values('511606','峰','228');insert into graderecord values('511607','明','240',90);insert into graderecord values('511608','楠','240',100);insert into graderecord values('511609','涛','240',67);insert into graderecord values('511610','博','240',75);insert into graderecord values('511611','铮','240',60);

查询:

select * from graderecord partition(p1);select * from graderecord partition(p2);select * from graderecord partition(p3);

说明:散列分区即为哈希分区,Oracle采用哈希码技术分区,具体分区如何由Oracle说的算,也可能我下一次搜索就不是这个数据了。

3、列表分区

建表:

create table graderecord(sno varchar2(10),sname varchar2(20),dormitory varchar2(3),grade int)partition by list(dormitory)(partition d229 values('229'),partition d228 values('228'),partition d240 values('240'))

以上根据宿舍来进行列表分区,插入与范围分区实验相同的数据。

insert into graderecord values('511601','魁','229',92);insert into graderecord values('511602','凯','229',62);insert into graderecord values('511603','东','229',26);insert into graderecord values('511604','亮','228',77);insert into graderecord values('511605','敬','228',47);insert into graderecord(sno,sname,dormitory) values('511606','峰','228');insert into graderecord values('511607','明','240',90);insert into graderecord values('511608','楠','240',100);insert into graderecord values('511609','涛','240',67);insert into graderecord values('511610','博','240',75);insert into graderecord values('511611','铮','240',60);

查询:

select * from graderecord partition(d229);select * from graderecord partition(d228);select * from graderecord partition(d240);
4、复合分区
4.1、范围-散列分区

先声明一下:列表分区不支持多列,但是范围分区和哈希分区支持多列。

create table graderecord(sno varchar2(10),sname varchar2(20),dormitory varchar2(3),grade int)partition by range(grade)subpartition by hash(sno,sname)(partition p1 values less than(75)( subpartition sp1,subpartition sp2),partition p2 values less than(maxvalue)( subpartition sp3,subpartition sp4));

以grade划分范围,然后以sno和sname划分散列分区,当数据量大的时候散列分区则趋于“平均”。

插入数据:

insert into graderecord values('511601','魁','229',92);insert into graderecord values('511602','凯','229',62);insert into graderecord values('511603','东','229',26);insert into graderecord values('511604','亮','228',77);insert into graderecord values('511605','敬','228',47);insert into graderecord(sno,sname,dormitory) values('511606','峰','228');insert into graderecord values('511607','明','240',90);insert into graderecord values('511608','楠','240',100);insert into graderecord values('511609','涛','240',67);insert into graderecord values('511610','博','240',75);insert into graderecord values('511611','铮','240',60);

查询:

select * from graderecord partition(p1);select * from graderecord partition(p2);select * from graderecord subpartition(sp1);select * from graderecord subpartition(sp2);select * from graderecord subpartition(sp3);select * from graderecord subpartition(sp4);

说明:当数据量越来越大时,哈希分区的分区表中数据越来越趋于平衡。

4.2、范围-列表分区

范围-列表分区有两种创立方式,先说说没有模板的创建方式

create table MobileMessage( ACCT_MONTH VARCHAR2(6), -- 帐期 格式:年月 YYYYMM AREA_NO VARCHAR2(10), -- 地域号码 DAY_ID VARCHAR2(2), -- 本月中的第几天 格式 DD SUBSCRBID VARCHAR2(20), -- 用户标识 SVCNUM VARCHAR2(30) -- 手机号码)partition by range(ACCT_MONTH,AREA_NO) subpartition by list(DAY_ID)(partition p1 values less than('200705','012')(subpartition shangxun1 values('01','02','03','04','05','06','07','08','09','10'),subpartition zhongxun1 values('11','12','13','14','15','16','17','18','19','20'),subpartition xiaxun1 values('21','22','23','24','25','26','27','28','29','30','31')),partition p2 values less than('200709','014')(subpartition shangxun2 values('01','02','03','04','05','06','07','08','09','10'),subpartition zhongxun2 values('11','12','13','14','15','16','17','18','19','20'),subpartition xiaxun2 values('21','22','23','24','25','26','27','28','29','30','31')),partition p3 values less than('200801','016')(subpartition shangxun3 values('01','02','03','04','05','06','07','08','09','10'),subpartition zhongxun3 values('11','12','13','14','15','16','17','18','19','20'),subpartition xiaxun3 values('21','22','23','24','25','26','27','28','29','30','31')))

插入数据:

insert into MobileMessage values('200701','010','04','ghk001','13800000000');insert into MobileMessage values('200702','015','12','myx001','13633330000');insert into MobileMessage values('200703','015','24','hjd001','13300000000');insert into MobileMessage values('200704','010','04','ghk001','13800000000');insert into MobileMessage values('200705','010','04','ghk001','13800000000');insert into MobileMessage values('200705','011','18','sxl001','13222000000');insert into MobileMessage values('200706','011','21','sxl001','13222000000');insert into MobileMessage values('200706','012','11','tgg001','13800044400');insert into MobileMessage values('200707','010','04','ghk001','13800000000');insert into MobileMessage values('200708','012','24','tgg001','13800044400');insert into MobileMessage values('200709','014','29','zjj001','13100000000');insert into MobileMessage values('200710','014','29','zjj001','13100000000');insert into MobileMessage values('200711','014','29','zjj001','13100000000');insert into MobileMessage values('200711','013','30','wgc001','13444000000');insert into MobileMessage values('200712','013','30','wgc001','13444000000');insert into MobileMessage values('200712','010','30','ghk001','13800000000');insert into MobileMessage values('200801','015','22','myx001','13633330000');

查询:

select * from MobileMessage;select * from MobileMessage partition(p1);select * from MobileMessage partition(p2);select * from MobileMessage partition(p3);select * from graderecord subpartition(shangxun1);select * from graderecord subpartition(zhongxun1);select * from graderecord subpartition(xiaxun1);select * from graderecord subpartition(shangxun2);select * from graderecord subpartition(zhongxun2);select * from graderecord subpartition(xiaxun2);select * from graderecord subpartition(shangxun3);select * from graderecord subpartition(zhongxun3);select * from graderecord subpartition(xiaxun3);

说明:范围分区 range(A,B)的分区法则,范围分区都是 values less than(A,B)的,通常情况下以A为准,如果小于A的不用考虑B,直接插进去,如果等于A那么考虑B,要是满足B的话也插进去。

另一种范围-列表分区,包含模板的(比较繁琐,但是更加精确,处理海量存储数据十分必要)

建表:

create table MobileMessage( ACCT_MONTH VARCHAR2(6), -- 帐期 格式:年月 YYYYMM AREA_NO VARCHAR2(10), -- 地域号码 DAY_ID VARCHAR2(2), -- 本月中的第几天 格式 DD SUBSCRBID VARCHAR2(20), -- 用户标识  SVCNUM VARCHAR2(30) -- 手机号码)partition by range(ACCT_MONTH,AREA_NO) subpartition by list(DAY_ID)subpartition template( subpartition sub1 values('01'),subpartition sub2 values('02'), subpartition sub3 values('03'),subpartition sub4 values('04'), subpartition sub5 values('05'),subpartition sub6 values('06'), subpartition sub7 values('07'),subpartition sub8 values('08'), subpartition sub9 values('09'),subpartition sub10 values('10'), subpartition sub11 values('11'),subpartition sub12 values('12'), subpartition sub13 values('13'),subpartition sub14 values('14'), subpartition sub15 values('15'),subpartition sub16 values('16'), subpartition sub17 values('17'),subpartition sub18 values('18'), subpartition sub19 values('19'),subpartition sub20 values('20'), subpartition sub21 values('21'),subpartition sub22 values('22'), subpartition sub23 values('23'),subpartition sub24 values('24'), subpartition sub25 values('25'),subpartition sub26 values('26'), subpartition sub27 values('27'),subpartition sub28 values('28'), subpartition sub29 values('29'),subpartition sub30 values('30'), subpartition sub31 values('31'))(partition p_0701_010 values less than('200701','011'),partition p_0701_011 values less than('200701','012'),partition p_0701_012 values less than('200701','013'),partition p_0701_013 values less than('200701','014'), partition p_0701_014 values less than('200701','015'),partition p_0701_015 values less than('200701','016'),partition p_0702_010 values less than('200702','011'),partition p_0702_011 values less than('200702','012'),partition p_0702_012 values less than('200702','013'),partition p_0702_013 values less than('200702','014'),partition p_0702_014 values less than('200702','015'),partition p_0702_015 values less than('200702','016'),partition p_0703_010 values less than('200703','011'),partition p_0703_011 values less than('200703','012'),partition p_0703_012 values less than('200703','013'),partition p_0703_013 values less than('200703','014'),partition p_0703_014 values less than('200703','015'),partition p_0703_015 values less than('200703','016'),partition p_0704_010 values less than('200704','011'),partition p_0704_011 values less than('200704','012'),partition p_0704_012 values less than('200704','013'),partition p_0704_013 values less than('200704','014'),partition p_0704_014 values less than('200704','015'),partition p_0704_015 values less than('200704','016'),partition p_0705_010 values less than('200705','011'),partition p_0705_011 values less than('200705','012'),partition p_0705_012 values less than('200705','013'),partition p_0705_013 values less than('200705','014'),partition p_0705_014 values less than('200705','015'),partition p_0705_015 values less than('200705','016'),partition p_0706_010 values less than('200706','011'),partition p_0706_011 values less than('200706','012'),partition p_0706_012 values less than('200706','013'),partition p_0706_013 values less than('200706','014'),partition p_0706_014 values less than('200706','015'),partition p_0706_015 values less than('200706','016'),partition p_0707_010 values less than('200707','011'),partition p_0707_011 values less than('200707','012'),partition p_0707_012 values less than('200707','013'),partition p_0707_013 values less than('200707','014'),partition p_0707_014 values less than('200707','015'),partition p_0707_015 values less than('200707','016'),partition p_0708_010 values less than('200708','011'),partition p_0708_011 values less than('200708','012'),partition p_0708_012 values less than('200708','013'),partition p_0708_013 values less than('200708','014'),partition p_0708_014 values less than('200708','015'),partition p_0708_015 values less than('200708','016'),partition p_0709_010 values less than('200709','011'),partition p_0709_011 values less than('200709','012'),partition p_0709_012 values less than('200709','013'),partition p_0709_013 values less than('200709','014'),partition p_0709_014 values less than('200709','015'), partition p_0709_015 values less than('200709','016'),partition p_0710_010 values less than('200710','011'),partition p_0710_011 values less than('200710','012'),partition p_0710_012 values less than('200710','013'),partition p_0710_013 values less than('200710','014'),partition p_0710_014 values less than('200710','015'),partition p_0710_015 values less than('200710','016'),partition p_0711_010 values less than('200711','011'),partition p_0711_011 values less than('200711','012'),partition p_0711_012 values less than('200711','013'),partition p_0711_013 values less than('200711','014'),partition p_0711_014 values less than('200711','015'),partition p_0711_015 values less than('200711','016'),partition p_0712_010 values less than('200712','011'),partition p_0712_011 values less than('200712','012'),partition p_0712_012 values less than('200712','013'),partition p_0712_013 values less than('200712','014'),partition p_0712_014 values less than('200712','015'),partition p_0712_015 values less than('200712','016'),partition p_0801_010 values less than('200801','011'),partition p_0801_011 values less than('200801','012'),partition p_0801_012 values less than('200801','013'),partition p_0801_013 values less than('200801','014'),partition p_0801_014 values less than('200801','015'),partition p_0801_015 values less than('200801','016'),partition p_other values less than(maxvalue, maxvalue));

这个是带有模板子分区的,模板子分区详细到月中的天。这种分区模式只要建立了分区就会自动创建子分区的。

插入数据:

insert into MobileMessage values('200701','010','04','ghk001','13800000000');insert into MobileMessage values('200702','015','12','myx001','13633330000');insert into MobileMessage values('200703','015','24','hjd001','13300000000');insert into MobileMessage values('200704','010','04','ghk001','13800000000');insert into MobileMessage values('200705','010','04','ghk001','13800000000');insert into MobileMessage values('200705','011','18','sxl001','13222000000');insert into MobileMessage values('200706','011','21','sxl001','13222000000');insert into MobileMessage values('200706','012','11','tgg001','13800044400');insert into MobileMessage values('200707','010','04','ghk001','13800000000');insert into MobileMessage values('200708','012','24','tgg001','13800044400');insert into MobileMessage values('200709','014','29','zjj001','13100000000');insert into MobileMessage values('200710','014','29','zjj001','13100000000');insert into MobileMessage values('200711','014','29','zjj001','13100000000');insert into MobileMessage values('200711','013','30','wgc001','13444000000');insert into MobileMessage values('200712','013','30','wgc001','13444000000');insert into MobileMessage values('200712','010','30','ghk001','13800000000');insert into MobileMessage values('200801','015','22','myx001','13633330000');

查询:

select * from MobileMessage partition(p_0701_010);select * from MobileMessage subpartition(p_0701_010_sub4);

分区的维护操作

1、分裂分区

以范围分区为例:

alter table graderecord split partition jige at(75) into(partition keyi,partition lianghao);

把分区及格分裂为两个分区:可以和良好。

2、合并分区

以范围分区为例:

alter table graderecord merge partitions keyi,lianghaointo partition jige;

把可以和良好两个分区合并为及格

3、添加分区

由于在范围分区上添加分区要求添加的分区范围大于原有分区最大值,但原有分区最大值已经为maxvalue,故本处以第二个散列分区为例:

alter table graderecord add partition p4;

给散列分区例子又增加了一个分区p4 。

4、删除分区
alter table table_name drop partition partition_name;
5、截断分区,清空分区中的数据
alter table table_name truncate partition partition_name;
6、查看当前表有多少个分区
select * from user_tab_partitions where table_name='TEST_PART';

说明:对待分区的操作同样可以对待子分区,效果一样。删除一个分区会同时删除其下的子分区。合并多个分区也会把他们的子分区自动合并。分裂分区时注意分裂点。

另外不带模板子分区和带有模板子分区的分区表操作的区别:带有子分区模板的分区表在添加分区时候自动添加子分区,不带模板子分区的分区表没有这个功能;带有子分区模板的分区表在更改分区时只需更改分区,不带模板子分区的分区表在更改分区时一定注意连同子分区一起更改。

参考:

Oracle表分区分为四种:范围分区,散列分区,列表分区和复合分区

技术分享|Oracle分区技术的实现总结