我建立了个双字段的分区表:
drop table p_test3;
create table p_test3 (
c1 number,
c2 number,
c3 number,
c4 number default 100
) partition by range(c1,c2)(
partition p1 values less than (51,201),
partition p2 values less than (51,301),
partition p3 values less than (101,201),
partition p4 values less than (101,301),
partition p5 values less than (maxvalue,maxvalue)
);
然后 我插入了一些数,数据的分布是这样的 :
中间空白的地方为p3
请问oracle对与多个分区条件 数据是按照什么规则存放的啊 最好能给一个伪代码算法,谢谢了。这几天弄的头都大了。
照你这么说 对于(52,205)52和p2 第一个比比不符合 然后205和P2的第二个(301)比符合应该放入P2 可是事实是放入了P3 这个。。尴尬啊。
追答是了,回答的有点草率。
1 参考了下区间类型数据结构的对比逻辑,更正一下,当第二个条件比较时要对比第一个值是否相等。操作数使用op[a, b],分区使用pn[x, y]
逻辑伪代码如下:
var n
for n=1 to m
if op[a] m+1 then
throw error --无可保存的分区,出错
end if
谢谢,这个伪码写的很清楚。我想确认一点的是这个是官方的说明还是大侠自己猜测的规律啊。我找了一些资料但是这方面的东西太少了。单分区的话都是比较小于号的,为啥多分区键就需要考虑等于的情况了呢?这样设计有啥目的(优点)?
追答mark一下,这个只是个人的逻辑方法理解。
这其实是区间(在有些语言里作为一种数据类型,如fortran,ruby中;而数据结构中也在区间的讨论)的排序方法,以前看过网上有很多种算法来进行排序,通常给出了些可信度的公式和一些定理,算法导论里有个类似和我上边写的逻辑(使用的是快速排序方法)。
有兴趣的话,看看mysql的源代码里有没有partition的算法处理,mysql的range column partition和oracle的range partition一样,只是不知底层算法是否也一样。
你这个说了跟没说似的。。 你看上图 我51,200这个字段依然存放在p1里面 显然51已经超过p1的第一个分区键值了。而且对于像50,202这种字段 如果按照类似于字符串的比较方式 先比较50<51 所以确定为p1或p2 再比较202大于201 小于301 所以这个值应该存在p2里面啊,但是 事实上是在p1里面。求解释