今天网友问了我一个关于多个列的Range分区的问题, 说是记录没有进入到他想要的分区, 由于在实际应用中我还没有用过这样的分区, 在理解那条记录要进入那个分区时, 还真有点难, 在一个列时, 是用小于来判断的, 那多个列时, 不是每个列都是用小于来判断的. 作为一个组合字段, 前导的字段是用小于等于来排序的, 我们可以想着"A2 < A3 < B2 < B3", 这时插入A1时, 五个值的排序是如何的呢? 按照字典的排序方法当然"A1"是最小的了, 而"A2"就进入了第二个分区.
不知道我自已在说什么? 总之这种情况下不是两个列都是用小于来比较的.
create table t (c1 date,c2 number) partition by range(c1,c2)
(
partition p11 values less than (to_date('20010201','yyyymmdd'),2),
partition p12 values less than (to_date('20010201','yyyymmdd'),3),
partition p21 values less than (to_date('20010301','yyyymmdd'),2),
partition p22 values less than (to_date('20010301','yyyymmdd'),3)
);
insert into t values (to_date('20010201','yyyymmdd'),1);
insert into t values (to_date('20010202','yyyymmdd'),2);
--结果第一条数据进了p11(期望是p21),第二条数据进了p21(期望是p22)
SQL> select * from t partition (p11);
C1 C2
--------- ----------
01-FEB-01 1
SQL> select * from t partition (p21);
C1 C2
--------- ----------
02-FEB-01 2
那个网友还提议Oracle应当加入List+List的复合分区, 我想List+Hash也是有用的吧.
留言 (1)
Oracle 11g支持那网友想要的分区方式了.
Posted by anysql | Jul 28, 2007 11:08 PM