使用自动方法创建示例分区表
在创建示例分区表时,可以为每个数据分区指定范围。分区表使用了数据组织方案,即,表数据根据该表中一个或多个表分区键列中的值分布到多个存储对象(称为数据分区或范围)中。根据CREATE TABLE语句的PARTITION BY子句中指定的内容,给定表的数据被划分到多个存储对象中。范围由PARTITION BY子句的 STARTING FROM和ENDING AT值指定。这些存储对象可以在不同的表空间中,也可以在相同表空间中。所有指定的表空间在下列方面必须相同:页大小、扩展数据块大小、存储机制(DMS 和 SMS)和类型(常规或大型),并且所有表空间必须位于相同数据库分区组中。表分区功能简化了表数据转入和转出以及管理工作,并且提高了索引布置灵活性和查询处理效率。与普通的表相比,分区表包含的数据可以多得多。分区表最多可以有 32767 个数据分区。可以对分区表添加数据分区、将数据分区与分区表相连以及断开数据分区与分区表的连接,并且,可以将一个表的多个数据分区范围存储在一个表空间中。不支持在分区表中使用XML和DATALINK等类型。
表分区键是一个或多个表列的有序集合。表分区键列中的值用来确定每个表行所属的数据分区。选择有效的表分区键列对于充分利用表分区功能的优点来说十分关键。下列准则可以帮助您为分区表选择最有效的表分区键列:
• 将范围定义成与数据转入大小相匹配。最常见的情况是根据日期或时间列对数据进行分区。
• 将范围详细程度定义为与数据转出相匹配。最常见的情况是使用月份或季度。
• 根据有益于消除分区的列进行分区。
分区表可以包含下列数据类型,但不支持将它们用作表分区键列:
• 用户定义的类型(结构化)
• LONG VARCHAR
• LONG VARCHAR FOR BIT DATA
• BLOB
• BINARY LARGE OBJECT
• CLOB
• CHARACTER LARGE OBJECT
• DBCLOB
• LONG VARGRAPHIC
• REF
• C变长字符串
• Pascal变长字符串
数据分区是表的一部分行,这些行不与其他部分的行存储在一起,并且按照 CREATE TABLE语句的PARTITION BY子句中提供的规范分组。如果一个表是使用PARTITION BY子句创建的,则该表是分区表。
可以通过在 DB2 控制中心中使用“创建表”向导或者通过使用 CREATE TABLE语句来创建示例分区表。要使用 DB2 CLP来创建示例分区表,请发出 CREATE TABLE 语句:
CREATE TABLE < NAME > ( < column_name > < data_type > < null_attribute > ) IN < table space list > PARTITION BY RANGE ( < column expression > ) STARTING FROM < constant > ENDING < constant > EVERY < constant >
自动生成方法十分简单,它使您能够快速方便地创建许多数据分区。此方法适合于创建基于日期或数值并且大小相等的范围。如果选择使用CREATE TABLE语句的EVERY子句来自动生成数据分区,那么只能将一列用作表分区键。使用自动生成的语法格式(包含EVERY子句)创建的表在表分区键中只能使用数字或日期时间类型。在自动生成的语法格式中,不支持MINVALUE和MAXVALUE。范围按升序排列。EVERY子句中的增量必须大于零。ENDING值必须大于或等于STARTING值。我们先来看一个最简单的创建分区表的例子,在DB2CLP窗口中连上数据库,发出CREATE TABLE命令,具体如清单10所示:
- - 清单10 .创建示例分区表TEST1
C:\> DB2 CREATE TABLE TEST1 ( COL1 INT , COL2 INT ) PARTITION BY RANGE( COL2 ) ( STARTING FROM ( 1 ) INCLUSIVE ENDING AT ( 100 ) EXCLUSIVE EVERY ( 10 ) ) DB20000I SQL命令成功完成
命令执行成功,这样我们就创建了一个示例分区表TEST1,其包含10个数据分区,每个数据分区包含10个键值:
1<=col2<11
11<=col2< 21
. . . . . .
91 <=col2<= 100
STARTING子句指定数据分区范围的下界。对于最低数据分区范围来说,此子句是必需的(尽管可以将边界定义为 MINVALUE)。INCLUSIVE表示将所有等于指定值的值都包括在包含此边界的数据分区中。最低数据分区范围是具有最低指定边界的数据分区。清单10中STARTING参数指定整体数据范围从1开始,其后的INCLUSIVE参数表示端值1包含在第一个数据分区内。
ENDING(或 VALUES)子句指定数据分区范围的上界。对于最高数据分区范围来说,此子句是必需的(尽管可以将边界定义为 MAXVALUE)。最高数据分区范围是具有最高指定边界的数据分区。EXCLUSIVE表示所有等于指定值的值都不包括在包含此边界的数据分区中。清单10中ENDING参数表示整体数据范围从到100为止,其后的EXCLUSIVE表示,最后一个数据分区不包含端值100。
如果未对某个数据分区指定ENDING子句,则下一个更大数据分区就必须指定STARTING子句。否则,如果未指定STARTING子句,则上一个数据分区就必须指定ENDING子句。
由于整体起始界限(1)包括端值,所以第一个数据分区(col2>= 1且col2< 11 )的起始值包括端值。同样,由于整体结束界限(100)不包括端值,所以最后一个数据分区(col2 >= 91且col2<100)的结束界限不包括端值。其余 STARTING 值都包括端值,并且其余 ENDING 值全都不包括端值。每个数据分区都存放 n 个键值,其中 n 由 EVERY子句指定。由于没有指定表空间,所以10个数据分区使用缺省表空间USERSPACE1。缺省情况下,索引将存储在以下表空间中:USERSPACE1。
接下来我们创建一个稍微复杂些的示例分区表,在DB2CLP窗口中连上数据库,发出CREATE TABLE命令,具体如清单11所示:
- - 清单11 .创建示例分区表TEST2
C:\> DB2 CREATE TABLE TEST2 ( ID INTEGER NOT NULL , AGE INTEGER NOT NULL ) PARTITION BY RANGE ( AGE NULLS LAST ) ( STARTING FROM ( 1 ) INCLUSIVE ENDING AT ( 100 ) EXCLUSIVE EVERY ( 10 ) ) IN TABLESPACE1, TABLESPACE2, TABLESPACE3 CYCLE INDEX IN USERSPACE1 DB20000I SQL命令成功完成
命令成功完成后,这样我们创建了一个示例分区表TEST2,其包含10个数据分区,每个数据分区包含10个键值:
1<=AGE<11
11<=AGE< 21
. . . . . . . . .
91 <=AGE< 100
由于没有显式给数据分区指定表空间,所以将使用循环法将3个表空间(TABLESPACE1,TABLESPACE2和TABLESPACE3)指定给10个数据分区。缺省情况下,索引将存储在以下表空间中:USERSPACE1。
NULL 子句指定考虑数据分区布置时是将空值安排在高位置还是低位置。缺省情况下,将空值安排在高位置。在此情况下,将把表分区键列中的空值视为正无穷并放到以 MAXVALUE 结尾的范围中。如果未定义这样的数据分区,就会将空值视为超出范围的值。如果要排除表分区键列中的空值,请使用 NOT NULL约束。LAST 指定让空值在排序的值列表中最后出现。FIRST 指定让空值在排序的值列表中最先出现。PARTITION BY RANGE 指定表分区键为AGE,其后跟的NULLS LAST参数表示含有空值的数据行就会排到最后,您也可以在升序排序中使用NULLS FIRST,这样含有空值的数据行会出现在第一个。
STARTING参数指定整体数据范围从1开始,其后的INCLUSIVE参数表示端值1包含在第一个数据分区内,ENDING参数表示整体数据范围从到100为止,其后的EXCLUSIVE表示,最后一个数据分区不包含端值100。由于整体起始界限(1)包括端值,所以第一个数据分区(AGE>= 1且AGE< 11 )的起始值包括端值。同样,由于整体结束界限(100)不包括端值,所以最后一个数据分区(AGE>= 91且AGE<100)的结束界限不包括端值。其余 STARTING 值都包括端值,并且其余 ENDING 值全都不包括端值。每个数据分区都存放 n 个键值,其中 n 由 EVERY子句指定。
接下来我们创建示例分区表TEST3,用来对表数据进行分区的列是RQ,表数据将存储在下列表空间
中:TABLESPACE1,TABLESPACE2和TABLESPACE3。缺省情况下,索引将存储在以下表空间中:USERSPACE1。大数据将存储在下列表空间中:LARGETBS1,LARGETBS2和LARGETBS3。在DB2CLP窗口中连上数据库,发出CREATE TABLE命令,具体如清单12所示:
- - 清单12 .自动创建示例分区表TEST3
此语句生成 12 个数据分区,每个数据分区包含 1 个键值:C:\> DB2 CREATE TABLE TEST3 ( ID INTEGER NOT NULL , RQ DATE NOT NULL , IMAGE BLOB ( 1 M ) NOT NULL LOGGED NOT COMPACT ) PARTITION BY RANGE ( RQ NULLS LAST ) ( STARTING FROM ( '2007-01-01' ) INCLUSIVE ENDING AT ( '2007-12-31' ) INCLUSIVE EVERY ( 1 MONTHS ) ) IN TABLESPACE1 , TABLESPACE2, TABLESPACE3 CYCLE INDEX IN USERSPACE1 LONG IN LARGETBS1 , LARGETBS2 , LARGETBS3 CYCLE DB20000I SQL命令成功完成
(RQ) >= ( ' 2007-01-01 ' ) , (RQ) < (' 2007-02-01 ' )
(RQ) >= ( ' 2007-02-01 ' ) , (RQ) < (' 2007-03-01 ' )
. . . . . .
(RQ) >= ( ' 2007-12-01 ' ) , (RQ) <= (' 2007-12-31 ' )
由于整体起始界限( ' 2007-01-01 ' )包括端值,所以第一个数据分区的起始值包括端值。同样,由于整体结束界限(' 2007-12-31 ' )包括端值,所以最后一个数据分区的结束界限包括端值。其余 STARTING 值都包括端值,并且其余 ENDING 值也都包括端值。每个数据分区都存放 n 个键值,其中 n 由 EVERY 子句指定。使用公式 (start + every) 来确定每个数据分区的范围末端。如果 START 到 END 的范围无法整除 EVERY 值,最后一个数据分区包含的键值就会较少。