oracle 表分区 双字段分区数据分布问题

我建立了个双字段的分区表:
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对与多个分区条件 数据是按照什么规则存放的啊 最好能给一个伪代码算法,谢谢了。这几天弄的头都大了。

第1个回答  2019-06-04
你把那个分区看成51.201不就行了,整数部分是51,小数部分是201,先比较整数,整数满足了就不要小数了,整数相等再比较小数不就可以了,完美解决,哪来那么复杂。。。
第2个回答  推荐于2016-03-31
range分区使用的就是比较大小,理解正确,注意是less than方式。
过程:把分区按值范围从小到大排序,然后对要操作的值开始和第一个分区比较,先比较第一个字段,符合后直接放入第一个分区,不符合条件后再比较第二个字段,符合后放入第一个分区,不符合则依次和第二个分区比较。
(50, 任意值)第一个比较50 less than 51符合,不进行第二个比较,存放在p1区;
(51,205)第一个比较不符合,进行第二个比较也不符合;和第二个分区比较,第一个条件不符合,第二个比较205 less then 301符合,放入第二个分区p2;
依次类推。追问

照你这么说 对于(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一样,只是不知底层算法是否也一样。

本回答被提问者和网友采纳
第3个回答  2012-11-29
存放规则:
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)

select * from p_test3(p1) where c1<51 and c2<201;追问

你这个说了跟没说似的。。 你看上图 我51,200这个字段依然存放在p1里面 显然51已经超过p1的第一个分区键值了。而且对于像50,202这种字段 如果按照类似于字符串的比较方式 先比较50<51 所以确定为p1或p2 再比较202大于201 小于301 所以这个值应该存在p2里面啊,但是 事实上是在p1里面。求解释

相似回答