我一开始、以及网上也有很多人对DB2数据库双字段分区取值范围的理解是,以第一个分区字段为基准,首先要满足第一个字段取值的范围,然后还需满足第二字段取值范围的数据才能被插入该分区中,但这句话不完全对。
举个例子来说,现在有个丈母娘要招女婿,丈母娘爱女心切,所以提出这样的要求。首先犯法的事情可不好做得,所以年龄要不小于24岁、且不大于30岁。第二,身高要在170cm至188cm之间,太矮了人样子不好看那。丈母娘的女儿天生丽质,来报名的人络绎不绝,若是一个个面试那还不得等到猴年马月啦~~,于是乎精明的丈母娘建了一张人员资料表,希望通过导入报名人员资料利用范围分区自动将不符合要求的人筛选掉。
纳婿的消息张榜后,其中有这样的三个人(见下表)
姓名
年龄
身高
小罗
23
182
老张
36
175
小明
30
153
首先小罗和老张由于年龄超范围,直接被分区条件筛选了,说明双字段分区的确是以第一个分区字段为基准,首先要满足第一个字段取值的范围,这点是毋庸置疑了。
小明虽然年龄符合了标准,但他知道自己身高不行,不过他怀有诚意,希望能有奇迹能发生。那么结果怎么样了呢?
(数据导入后PEOPLE_LIST表查询结果)
最终小明的数据被成功插入了数据库中。小明很开心,难道真的是小明的诚意打动了上天?显然是丈母娘误解了双字段分区的用法。
那双字段分区的取值应该是怎么样的呢
比如现在有个双字段分区为,Starting from ( 1 , 2 ) Ending ( 3 , 8 ) ,两字段的字符类型都是数值类型,那么该分区的取值范围应该如下图所示。
(横坐标为第一字段的范围1
~ 3,纵坐标为第二地段的范围
2~ 8。)
在DB2数据库中,图中两条紫线覆盖范围内的值(不包含虚线部分)如1,300
2,-100等都能进入该分区。这也是为什么小明符合了标准。
注意,当字段类型不同的时候取值范围会随之改变。
比如这个例子:
因为是varchar类型,所以此时可以说8比100大,因此该数据能进入该分区。但如果是integer的情况下4,100是不行滴!
好了问题又来了,双字段分区我把两个字段连起来看,不就是该分区的区间了吗?
比如前面那个例子中的分区
该区间就把它看作是:[2.1,4.8] ,那么判断能否进该分区不就一目了然了?
我认为大多数情况下是可以这么做(因为这个方法是我想出来的。。。),但是!当分区范围比较挫客的时候,这个方法就行不通了。
比如如下情况:
若按上述方法,该分区的区间是:[101999,980000]
现在插入
101999
901111
980000
901111在此区间内,用该方法判断是可以插入的。但很显然901大于9,超过了该分区范围所以这条数据是不能插进这个分区的。