|
把多列range分区,好好研究了一下,不知道理解的对不对,拿出来共享一下,供初学者共同探讨。
问题背景:一直想实现list-range-list或者range-range-list分区,range-range-list分区最好,但是oracle目前显然不支持,模拟也没用,退而求其次,采用了list-range-list方式。学习分区开始,搜索了很多资料,一般都是浅尝辄止,并没有针对于比较复杂的复合分区作出比较详细的说明,对于list、hash来说,分区条件判断方式很简单,都是只支持单字段,不用说大家也都理解,这里主要说的就是利用range分区多列特性作出的其他复合方式模拟。
关键字:range条件判断方式
1。单字段 按分区顺序(Partition_Position) x<curValue,对于第一个分区来说,<curValue,这是最普遍的方式,举例:
create table ptemp
(
PKey integer
)
partition by range(PKey)
(
partition p1 values less than (1),
partition p2 values less than (2)
)
a>insert into ptemp values(0) --插入p1 因为0<1
b>insert into ptemp values(1) --插入p2 因为1<2
c>insert into ptemp values(2) --出错 没有分区条件符合
2。双字段 这是困扰我许久的问题,因为一直有单字段的惯性思维模式理解,认为 应该是x<curValue1,y<curValue2 然后依分区次序依次判断,符合即入,事实证明这是错误的!!! 期间看了资料(见下),有一些启发,但是这篇文章的[/url]"A2<A3<B2<B3"显然误导了我,让我又走了一个大弯路,让我以为先是把x判断完毕再去判断y, 一个,理解力真差。双字段最主要的是要明白x y两个字段是如何去判断分区条件的,最主要是和一个字段的区别所在,这个区别就是一个字段是x<,而双字段的前导字段是x<=,正是有了这个区别,所以很容易迷茫(起码我是),那么双字段的判断顺序是:x<=curValue1 y<curVaue2;下一个分区……,如果x<curValue1,符合立即插入,如果x=curValue1判断y,可以理解成一个特殊的处理,那么模拟list-range,如果是value1条件是连续值,则可以认为value1就是list模式,(如果不连续,y只在x相等的情况下起作用)举例:
create table ptemp
(
PKey integer,
vone integer
)
partition by range(PKey, vone)
(
partition p1 values less than (1, 2),
partition p2 values less than (1, 3),
partition p3 values less than (2, 2),
partition p4 values less than (2, 3)
)
a>insert into ptemp values(1,1) --插入p1 因为1<=1 & 1<=2
b>insert into ptemp values(1,2) --插入p2 因为1<=1 & 2 < 3
c>insert into ptemp values(2,1) --插入p3 因为2<=2 & 1 < 2
d>insert into ptemp values(2,2) --插入p4 因为2<=2 & 2 < 3
用rang(x,y)模拟list-range最重要的就是分区的顺序,因为oracle是顺序判断入哪个分区的。
3。再增加字段 3个,4个…… 和双字段道理是一样的,需要注意的是除了最后一个字段,其余都是前导字段,也就是说x,y,z x,y都是按x<= y<=判断的 而z是按z<判断的(oracle搞这个干吗??)
举例:
create table ptemp
(
PKey integer,
vone integer,
vtow integer
)
partition by range(PKey, vone,vtow)
(
partition p1 values less than (1, 2, 2),
partition p2 values less than (1, 3, 3),
partition p3 values less than (2, 2, 2),
partition p4 values less than (2, 3, 3)
)
a>insert into ptemp values(1,2,1) --插入p1 因为1<=1 & 2<=2 & 1<2
b>insert into ptemp values(1,3,2) --插入p2 因为1<=1 & 2 < 3 & 2<3
c>insert into ptemp values(2,2,1) --插入p3 因为2<=2 & 2 <= 2 & 1<2
d>insert into ptemp values(2,3,1) --插入p4 因为2<=2 & 3 <= 3 & 1<3
这么模拟有不足的地方比如
e>insert into ptemp values(1,3,1) --希望不插入 但还是插入了p2 因为1<=2 & 3 <= 3 & 1<3 如果range的判断条件改成PreValue<x<=CurValue就prefect了
[B]资料:[url]http://xsb.itpub.net/post/419/58475[/B] |
|