12
返回列表 发新帖
楼主: sorrowfox

好奇怪的问题-双字段范围分区

[复制链接]
论坛徽章:
0
11#
 楼主| 发表于 2007-4-14 17:13 | 只看该作者
把多列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]

使用道具 举报

回复
论坛徽章:
0
12#
发表于 2007-4-19 16:29 | 只看该作者
不错,学了一下多字段的分区的知识,回去实验一下。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表