Oracle四种表分区介绍:范围分区,散列分区,列表分区和复合分区,oracle四种
一:范围分区
就是根据数据库表中某一字段的值的范围来划分分区,例如:
Sql代码
createtablegraderecord
(
snovarchar2(10),
snamevarchar2(20),
dormitoryvarchar2(3),
gradeint
)
partitionbyrange(grade)
(
partitionbujigevalueslessthan(60),--不及格
partitionjigevalueslessthan(85),--及格
partitionyouxiuvalueslessthan(maxvalue)--优秀
)
插入实验数据:
Sql代码
insertintograderecordvalues('511601','魁','229',92);
insertintograderecordvalues('511602','凯','229',62);
insertintograderecordvalues('511603','东','229',26);
insertintograderecordvalues('511604','亮','228',77);
insertintograderecordvalues('511605','敬','228',47);
insertintograderecord(sno,sname,dormitory)values('511606','峰','228');
insertintograderecordvalues('511607','明','240',90);
insertintograderecordvalues('511608','楠','240',100);
insertintograderecordvalues('511609','涛','240',67);
insertintograderecordvalues('511610','博','240',75);
insertintograderecordvalues('511611','铮','240',60);
下面查询一下全部数据,然后查询各个分区数据,代码一起写:
Java代码
select*fromgraderecord;
select*fromgraderecordpartition(bujige);
select*fromgraderecordpartition(jige);
select*fromgraderecordpartition(youxiu);
全部数据如下:
不及格数据如下:
及格数据如下:
优秀数据如下:
说明:数据中有空值,Oracle机制会自动将其规划到maxvalue的分区中。
二:散列分区
散列分区是根据字段的hash值进行均匀分布,尽可能的实现各分区所散列的数据相等。
还是刚才那个表,只不过把范围分区改换为散列分区,语法如下(删除表之后重建):
Sql代码
createtablegraderecord
(
snovarchar2(10),
snamevarchar2(20),
dormitoryvarchar2(3),
gradeint
)
partitionbyhash(sno)
(
partitionp1,
partitionp2,
partitionp3
);
插入实验数据,与范围分区实验插入的数据相同。
然后查询分区数据:
Sql代码
select*fromgraderecordpartition(p1);
select*fromgraderecordpartition(p2);
select*fromgraderecordpartition(p3);
p1分区的数据:
p2分区的数据:
p3分区的数据:
说明:散列分区即为哈希分区,Oracle采用哈希码技术分区,具体分区如何由Oracle说的算,也可能我下一次搜索就不是这个数据了。
三:列表分区
列表分区明确指定了根据某字段的某个具体值进行分区,而不是像范围分区那样根据字段的值范围来划分的。
Sql代码
createtablegraderecord
(
snovarchar2(10),
snamevarchar2(20),
dormitoryvarchar2(3),
gradeint
)
partitionbylist(dormitory)
(
partitiond229values('229'),
partitiond228values('228'),
partitiond240values('240')
)
以上根据宿舍来进行列表分区,插入与范围分区实验相同的数据,做查询如下:
Sql代码
select*fromgraderecordpartition(d229);
select*fromgraderecordpartition(d228);
select*fromgraderecordpartition(d240);
d229分区所得数据如下:
d228分区所得数据如下:
d240分区所得数据如下:
四:复合分区(范围-散列分区,范围-列表分区)
首先讲范围-散列分区。先声明一下:列表分区不支持多列,但是范围分区和哈希分区支持多列。
代码如下:
Sql代码
createtablegraderecord
(
snovarchar2(10),
snamevarchar2(20),
dormitoryvarchar2(3),
gradeint
)
partitionbyrange(grade)
subpartitionbyhash(sno,sname)
(
partitionp1valueslessthan(75)
(
subpartitionsp1,subpartitionsp2
),
partitionp2valueslessthan(maxvalue)
(
subpartitionsp3,subpartitionsp4
)
);
以grade划分范围,然后以sno和sname划分散列分区,当数据量大的时候散列分区则趋于“平均”。
插入数据:
Sql代码
insertintograderecordvalues('511601','魁','229',92);
insertintograderecordvalues('511602','凯','229',62);
insertintograderecordvalues('511603','东','229',26);
insertintograderecordvalues('511604','亮','228',77);
insertintograderecordvalues('511605','敬','228',47);
insertintograderecord(sno,sname,dormitory)values('511606','峰','228');
insertintograderecordvalues('511607','明','240',90);
insertintograderecordvalues('511608','楠','240',100);
insertintograderecordvalues('511609','涛','240',67);
insertintograderecordvalues('511610','博','240',75);
insertintograderecordvalues('511611','铮','240',60);
insertintograderecordvalues('511612','狸','244',72);
insertintograderecordvalues('511613','杰','244',88);
insertintograderecordvalues('511614','萎','244',19);
insertintograderecordvalues('511615','猥','244',65);
insertintograderecordvalues('511616','丹','244',59);
insertintograderecordvalues('511617','靳','244',95);
查询如下:
Sql代码
select*fromgraderecordpartition(p1);
select*fromgraderecordpartition(p2);
select*fromgraderecordsubpartition(sp1);
select*fromgraderecordsubpartition(sp2);
select*fromgraderecordsubpartition(sp3);
select*fromgraderecordsubpartition(sp4);
分区p1数据如下,本例中75分以下:
分区p2数据如下,本例中75分之上包括75分:
子分区sp1:
子分区sp2:
子分区sp3:
子分区sp4:
说明:当数据量越来越大时,哈希分区的分区表中数据越来越趋于平衡。
下面讲范围-列表分区
范围-列表分区有两种创立方式,先说说没有模板的创建方式,这个表我要重建:
Sql代码
createtableMobileMessage
(
ACCT_MONTHVARCHAR2(6),--帐期格式:年月YYYYMM
AREA_NOVARCHAR2(10),--地域号码
DAY_IDVARCHAR2(2),--本月中的第几天格式DD
SUBSCRBIDVARCHAR2(20),--用户标识
SVCNUMVARCHAR2(30)--手机号码
)
partitionbyrange(ACCT_MONTH,AREA_NO)subpartitionbylist(DAY_ID)
(
partitionp1valueslessthan('200705','012')
(
subpartitionshangxun1values('01','02','03','04','05','06','07','08','09','10'),
subpartitionzhongxun1values('11','12','13','14','15','16','17','18','19','20'),
subpartitionxiaxun1values('21','22','23','24','25','26','27','28','29','30','31')
),
partitionp2valueslessthan('200709','014')
(
subpartitionshangxun2values('01','02','03','04','05','06','07','08','09','10'),
subpartitionzhongxun2values('11','12','13','14','15','16','17','18','19','20'),
subpartitionxiaxun2values('21','22','23','24','25','26','27','28','29','30','31')
),
partitionp3valueslessthan('200801','016')
(
subpartitionshangxun3values('01','02','03','04','05','06','07','08','09','10'),
subpartitionzhongxun3values('11','12','13','14','15','16','17','18','19','20'),
subpartitionxiaxun3values('21','22','23','24','25','26','27','28','29','30','31')
)
)
插入实验数据:
Sql代码
insertintoMobileMessagevalues('200701','010','04','ghk001','13800000000');
insertintoMobileMessagevalues('200702','015','12','myx001','13633330000');
insertintoMobileMessagevalues('200703','015','24','hjd001','13300000000');
insertintoMobileMessagevalues('200704','010','04','ghk001','13800000000');
insertintoMobileMessagevalues('200705','010','04','ghk001','13800000000');
insertintoMobileMessagevalues('200705','011','18','sxl001','13222000000');
insertintoMobileMessagevalues('200706','011','21','sxl001','13222000000');
insertintoMobileMessagevalues('200706','012','11','tgg001','13800044400');
insertintoMobileMessagevalues('200707','010','04','ghk001','13800000000');
insertintoMobileMessagevalues('200708','012','24','tgg001','13800044400');
insertintoMobileMessagevalues('200709','014','29','zjj001','13100000000');
insertintoMobileMessagevalues('200710','014','29','zjj001','13100000000');
insertintoMobileMessagevalues('200711','014','29','zjj001','13100000000');
insertintoMobileMessagevalues('200711','013','30','wgc001','13444000000');
insertintoMobileMessagevalues('200712','013','30','wgc001','13444000000');
insertintoMobileMessagevalues('200712','010','30','ghk001','13800000000');
insertintoMobileMessagevalues('200801','015','22','myx001','13633330000');
查询结果如下:
Sql代码
select*fromMobileMessage;
分区p1查询结果如下:
分区p2查询结果如下:
子分区xiaxun2查询结果如下:
说明:范围分区 range(A,B)的分区法则,范围分区都是 values less than(A,B)的,通常情况下以A为准,如果小于A的不用考虑B,直接插进去,如果等于A那么考虑B,要是满足B的话也插进去。
另一种范围-列表分区,包含模板的(比较繁琐,但是更加精确,处理海量存储数据十分必要):
Sql代码
createtableMobileMessage
(
ACCT_MONTHVARCHAR2(6),--帐期格式:年月YYYYMM
AREA_NOVARCHAR2(10),--地域号码
DAY_IDVARCHAR2(2),--本月中的第几天格式DD
SUBSCRBIDVARCHAR2(20),--用户标识
SVCNUMVARCHAR2(30)--手机号码
)
partitionbyrange(ACCT_MONTH,AREA_NO)subpartitionbylist(DAY_ID)
subpartitiontemplate
(
subpartitionsub1values('01'),subpartitionsub2values('02'),
subpartitionsub3values('03'),subpartitionsub4values('04'),
subpartitionsub5values('05'),subpartitionsub6values('06'),
subpartitionsub7values('07'),subpartitionsub8values('08'),
subpartitionsub9values('09'),subpartitionsub10values('10'),
subpartitionsub11values('11'),subpartitionsub12values('12'),
subpartitionsub13values('13'),subpartitionsub14values('14'),
subpartitionsub15values('15'),subpartitionsub16values('16'),
subpartitionsub17values('17'),subpartitionsub18values('18'),
subpartitionsub19values('19'),subpartitionsub20values('20'),
subpartitionsub21values('21'),subpartitionsub22values('22'),
subpartitionsub23values('23'),subpartitionsub24values('24'),
subpartitionsub25values('25'),subpartitionsub26values('26'),
subpartitionsub27values('27'),subpartitionsub28values('28'),
subpartitionsub29values('29'),subpartitionsub30values('30'),
subpartitionsub31values('31')
)
(
partitionp_0701_010valueslessthan('200701','011'),
partitionp_0701_011valueslessthan('200701','012'),
partitionp_0701_012valueslessthan('200701','013'),
partitionp_0701_013valueslessthan('200701','014'),
partitionp_0701_014valueslessthan('200701','015'),
partitionp_0701_015valueslessthan('200701','016'),
partitionp_0702_010valueslessthan('200702','011'),
partitionp_0702_011valueslessthan('200702','012'),
partitionp_0702_012valueslessthan('200702','013'),
partitionp_0702_013valueslessthan('200702','014'),
partitionp_0702_014valueslessthan('200702','015'),
partitionp_0702_015valueslessthan('200702','016'),
partitionp_0703_010valueslessthan('200703','011'),
partitionp_0703_011valueslessthan('200703','012'),
partitionp_0703_012valueslessthan('200703','013'),
partitionp_0703_013valueslessthan('200703','014'),
partitionp_0703_014valueslessthan('200703','015'),
partitionp_0703_015valueslessthan('200703','016'),
partitionp_0704_010valueslessthan('200704','011'),
partitionp_0704_011valueslessthan('200704','012'),
partitionp_0704_012valueslessthan('200704','013'),
partitionp_0704_013valueslessthan('200704','014'),
partitionp_0704_014valueslessthan('200704','015'),
partitionp_0704_015valueslessthan('200704','016'),
partitionp_0705_010valueslessthan('200705','011'),
partitionp_0705_011valueslessthan('200705','012'),
partitionp_0705_012valueslessthan('200705','013'),
partitionp_0705_013valueslessthan('200705','014'),
partitionp_0705_014valueslessthan('200705','015'),
partitionp_0705_015valueslessthan('200705','016'),
partitionp_0706_010valueslessthan('200706','011'),
partitionp_0706_011valueslessthan('200706','012'),
partitionp_0706_012valueslessthan('200706','013'),
partitionp_0706_013valueslessthan('200706','014'),
partitionp_0706_014valueslessthan('200706','015'),
partitionp_0706_015valueslessthan('200706','016'),
partitionp_0707_010valueslessthan('200707','011'),
partitionp_0707_011valueslessthan('200707','012'),
partitionp_0707_012valueslessthan('200707','013'),
partitionp_0707_013valueslessthan('200707','014'),
partitionp_0707_014valueslessthan('200707','015'),
partitionp_0707_015valueslessthan('200707','016'),
partitionp_0708_010valueslessthan('200708','011'),
partitionp_0708_011valueslessthan('200708','012'),
partitionp_0708_012valueslessthan('200708','013'),
partitionp_0708_013valueslessthan('200708','014'),
partitionp_0708_014valueslessthan('200708','015'),
partitionp_0708_015valueslessthan('200708','016'),
partitionp_0709_010valueslessthan('200709','011'),
partitionp_0709_011valueslessthan('200709','012'),
partitionp_0709_012valueslessthan('200709','013'),
partitionp_0709_013valueslessthan('200709','014'),
partitionp_0709_014valueslessthan('200709','015'),
partitionp_0709_015valueslessthan('200709','016'),
partitionp_0710_010valueslessthan('200710','011'),
partitionp_0710_011valueslessthan('200710','012'),
partitionp_0710_012valueslessthan('200710','013'),
partitionp_0710_013valueslessthan('200710','014'),
partitionp_0710_014valueslessthan('200710','015'),
partitionp_0710_015valueslessthan('200710','016'),
partitionp_0711_010valueslessthan('200711','011'),
partitionp_0711_011valueslessthan('200711','012'),
partitionp_0711_012valueslessthan('200711','013'),
partitionp_0711_013valueslessthan('200711','014'),
partitionp_0711_014valueslessthan('200711','015'),
partitionp_0711_015valueslessthan('200711','016'),
partitionp_0712_010valueslessthan('200712','011'),
partitionp_0712_011valueslessthan('200712','012'),
partitionp_0712_012valueslessthan('200712','013'),
partitionp_0712_013valueslessthan('200712','014'),
partitionp_0712_014valueslessthan('200712','015'),
partitionp_0712_015valueslessthan('200712','016'),
partitionp_0801_010valueslessthan('200801','011'),
partitionp_0801_011valueslessthan('200801','012'),
partitionp_0801_012valueslessthan('200801','013'),
partitionp_0801_013valueslessthan('200801','014'),
partitionp_0801_014valueslessthan('200801','015'),
partitionp_0801_015valueslessthan('200801','016'),
partitionp_othervalueslessthan(maxvalue,maxvalue)
);
这个是带有模板子分区的,模板子分区详细到月中的天。这种分区模式只要建立了分区就会自动创建子分区的。
插入上面不带模板分区实验相同的数据,随机查询分区数据:
查询分区p_0701_010的数据:
Sql代码
select*fromMobileMessagepartition(p_0701_010);
查询结果:
查询子分区p_0701_010_sub4的数据:
Sql代码
select*fromMobileMessagesubpartition(p_0701_010_sub4);
查询结果如下:
查询分区p_0706_011的数据:
Sql代码
select*fromMobileMessagepartition(p_0706_011);
查询结果如下:
查询子分区p_0706_011_sub21的数据:
Sql代码
select*fromMobileMessagesubpartition(p_0706_011_sub21);
查询结果如下:
下面讲讲分区的维护操作:
(1)分裂分区,以第一个范围分区为例:
Sql代码
altertablegraderecordsplitpartitionjigeat(75)
into(partitionkeyi,partitionlianghao);
把分区及格分裂为两个分区:可以和良好。
(2)合并分区,以第一个范围分区为例:
Sql代码
altertablegraderecordmergepartitionskeyi,lianghao
intopartitionjige;
把可以和良好两个分区合并为及格。
(3)添加分区,由于在范围分区上添加分区要求添加的分区范围大于原有分区最大值,但原有分区最大值已经为maxvalue,故本处以第二个散列分区为例:
Sql代码
altertablegraderecordaddpartitionp4;
给散列分区例子又增加了一个分区p4 。
(4)删除分区,语法:
Sql代码
altertabletable_namedroppartitionpartition_name;
(5)截断分区,清空分区中的数据
Sql代码
altertabletable_nametruncatepartitionpartition_name;
说明:对待分区的操作同样可以对待子分区,效果一样。删除一个分区会同时删除其下的子分区。合并多个分区也会把他们的子分区自动合并。分裂分区时注意分裂点。
另外不带模板子分区和带有模板子分区的分区表操作的区别:带有子分区模板的分区表在添加分区时候自动添加子分区,不带模板子分区的分区表没有这个功能;带有子分区模板的分区表在更改分区时只需更改分区,不带模板子分区的分区表在更改分区时一定注意连同子分区一起更改。