问题:
DB2 分区表中,如果某条记录中,分区键所在的列的值为空,那么DB2会把它存放在哪个分区中?
答案:
- CREATE TABLE 语句的 NULLS FIRST 和 NULLS LAST 子句指定考虑数据分区布置时将空值安排在高位置还是低位置。缺省情况下,将空值安排在高位置。在此情况下,将把表分区键列中的空值视为正无穷并放到以 MAXVALUE 结尾的范围中。如果未定义这样的数据分区,就会将空值视为超出范围的值。如果要排除表分区键列中的空值,请使用 NOT NULL 约束。LAST 指定让空值在排序的值列表中最后出现。FIRST 指定让空值在排序的值列表中最先出现。
测试:
创建两个表,一个parition key column是nulls first,另一个是nulls last,发现前者的空值被放在MINVALUE所在的分区了,后者的空值被放在MAXVALUE所在的分区了
db2 "create tablespace tbsp1 managed by automatic storage"
db2 "create tablespace tbsp2 managed by automatic storage"
db2 "create tablespace tbsp3 managed by automatic storage"
db2 "create table table1(name char(20), value date) partition by range(value NULLS FIRST) (starting (MINVALUE) ending '2014-04-30' in tbsp1, starting '2014-05-01' ending '2014-08-31' in tbsp2, starting '2014-09-01' ending (MAXVALUE) in tbsp3)"
db2 "create table table2(name char(20), value date) partition by range(value NULLS LAST) (starting (MINVALUE) ending '2014-04-30' in tbsp1, starting '2014-05-01' ending '2014-08-31' in tbsp2, starting '2014-09-01' ending (MAXVALUE) in tbsp3)"
db2 "insert into table1 values('AugFirst', '2014-08-01')"
db2 "insert into table1 values('FebThird', '2014-02-02')"
db2 "insert into table1 values('nullvalue1', NULL)"
db2 "insert into table2 select * from table1"
db2 "select substr(datapartitionname, 1, 30) as datapartitionname,substr( LOWVALUE, 1, 30) as LOWVALUE, substr(HIGHVALUE, 1, 30) as HIGHVALUE from syscat.datapartitions where tabname='TABLE1'"
DATAPARTITIONNAME LOWVALUE HIGHVALUE
------------------------------ ------------------------------ ------------------------------
PART0 MINVALUE '2014-04-30'
PART1 '2014-05-01' '2014-08-31'
PART2 '2014-09-01' MAXVALUE
3 record(s) selected.
db2 "alter table table1 DETACH PARTITION PART0 into temp1"
db2 "alter table table2 DETACH PARTITION PART2 into temp2"
$ db2 "select * from temp1"
NAME VALUE
-------------------- ----------
FebThird 02/02/2014
nullvalue1 -
2 record(s) selected.
$ db2 "select * from temp2"
NAME VALUE
-------------------- ----------
nullvalue1 -
1 record(s) selected.