使用自動方法創(chuàng)建示例分區(qū)表
在創(chuàng)建示例分區(qū)表時,可以為每個數(shù)據(jù)分區(qū)指定范圍?分區(qū)表使用了數(shù)據(jù)組織方案,即,表數(shù)據(jù)根據(jù)該表中一個或多個表分區(qū)鍵列中的值分布到多個存儲對象(稱為數(shù)據(jù)分區(qū)或范圍)中?根據(jù)CREATE TABLE語句的PARTITION BY子句中指定的內(nèi)容,給定表的數(shù)據(jù)被劃分到多個存儲對象中?范圍由PARTITION BY子句的 STARTING FROM和ENDING AT值指定?這些存儲對象可以在不同的表空間中,也可以在相同表空間中?所有指定的表空間在下列方面必須相同:頁大小?擴(kuò)展數(shù)據(jù)塊大小?存儲機(jī)制(DMS 和 SMS)和類型(常規(guī)或大型),并且所有表空間必須位于相同數(shù)據(jù)庫分區(qū)組中?表分區(qū)功能簡化了表數(shù)據(jù)轉(zhuǎn)入和轉(zhuǎn)出以及管理工作,并且提高了索引布置靈活性和查詢處理效率?與普通的表相比,分區(qū)表包含的數(shù)據(jù)可以多得多?分區(qū)表最多可以有 32767 個數(shù)據(jù)分區(qū)?可以對分區(qū)表添加數(shù)據(jù)分區(qū)?將數(shù)據(jù)分區(qū)與分區(qū)表相連以及斷開數(shù)據(jù)分區(qū)與分區(qū)表的連接,并且,可以將一個表的多個數(shù)據(jù)分區(qū)范圍存儲在一個表空間中?不支持在分區(qū)表中使用XML和DATALINK等類型?
表分區(qū)鍵是一個或多個表列的有序集合?表分區(qū)鍵列中的值用來確定每個表行所屬的數(shù)據(jù)分區(qū)?選擇有效的表分區(qū)鍵列對于充分利用表分區(qū)功能的優(yōu)點(diǎn)來說十分關(guān)鍵?下列準(zhǔn)則可以幫助您為分區(qū)表選擇最有效的表分區(qū)鍵列:
• 將范圍定義成與數(shù)據(jù)轉(zhuǎn)入大小相匹配?最常見的情況是根據(jù)日期或時間列對數(shù)據(jù)進(jìn)行分區(qū)?
• 將范圍詳細(xì)程度定義為與數(shù)據(jù)轉(zhuǎn)出相匹配?最常見的情況是使用月份或季度?
• 根據(jù)有益于消除分區(qū)的列進(jìn)行分區(qū)?
分區(qū)表可以包含下列數(shù)據(jù)類型,但不支持將它們用作表分區(qū)鍵列:
• 用戶定義的類型(結(jié)構(gòu)化)
• LONG VARCHAR
• LONG VARCHAR FOR BIT DATA
• BLOB
• BINARY LARGE OBJECT
• CLOB
• CHARACTER LARGE OBJECT
• DBCLOB
• LONG VARGRAPHIC
• REF
• C變長字符串
• Pascal變長字符串
數(shù)據(jù)分區(qū)是表的一部分行,這些行不與其他部分的行存儲在一起,并且按照 CREATE TABLE語句的PARTITION BY子句中提供的規(guī)范分組?如果一個表是使用PARTITION BY子句創(chuàng)建的,則該表是分區(qū)表?
可以通過在 DB2 控制中心中使用“創(chuàng)建表”向?qū)Щ蛘咄ㄟ^使用 CREATE TABLE語句來創(chuàng)建示例分區(qū)表?要使用 DB2 CLP來創(chuàng)建示例分區(qū)表,請發(fā)出 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 >
自動生成方法十分簡單,它使您能夠快速方便地創(chuàng)建許多數(shù)據(jù)分區(qū)?此方法適合于創(chuàng)建基于日期或數(shù)值并且大小相等的范圍?如果選擇使用CREATE TABLE語句的EVERY子句來自動生成數(shù)據(jù)分區(qū),那么只能將一列用作表分區(qū)鍵?使用自動生成的語法格式(包含EVERY子句)創(chuàng)建的表在表分區(qū)鍵中只能使用數(shù)字或日期時間類型?在自動生成的語法格式中,不支持MINVALUE和MAXVALUE?范圍按升序排列?EVERY子句中的增量必須大于零?ENDING值必須大于或等于STARTING值?我們先來看一個最簡單的創(chuàng)建分區(qū)表的例子,在DB2CLP窗口中連上數(shù)據(jù)庫,發(fā)出CREATE TABLE命令,具體如清單10所示:
- - 清單10 .創(chuàng)建示例分區(qū)表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命令成功完成
命令執(zhí)行成功,這樣我們就創(chuàng)建了一個示例分區(qū)表TEST1,其包含10個數(shù)據(jù)分區(qū),每個數(shù)據(jù)分區(qū)包含10個鍵值:
?
1<=col2<11
? 11<=col2< 21
? . . . . . .
? 91 <=col2<= 100
STARTING子句指定數(shù)據(jù)分區(qū)范圍的下界?對于最低數(shù)據(jù)分區(qū)范圍來說,此子句是必需的(盡管可以將邊界定義為 MINVALUE)?INCLUSIVE表示將所有等于指定值的值都包括在包含此邊界的數(shù)據(jù)分區(qū)中?最低數(shù)據(jù)分區(qū)范圍是具有最低指定邊界的數(shù)據(jù)分區(qū)?清單10中STARTING參數(shù)指定整體數(shù)據(jù)范圍從1開始,其后的INCLUSIVE參數(shù)表示端值1包含在第一個數(shù)據(jù)分區(qū)內(nèi)?
ENDING(或 VALUES)子句指定數(shù)據(jù)分區(qū)范圍的上界?對于最高數(shù)據(jù)分區(qū)范圍來說,此子句是必需的(盡管可以將邊界定義為 MAXVALUE)?最高數(shù)據(jù)分區(qū)范圍是具有最高指定邊界的數(shù)據(jù)分區(qū)?EXCLUSIVE表示所有等于指定值的值都不包括在包含此邊界的數(shù)據(jù)分區(qū)中?清單10中ENDING參數(shù)表示整體數(shù)據(jù)范圍從到100為止,其后的EXCLUSIVE表示,最后一個數(shù)據(jù)分區(qū)不包含端值100?
如果未對某個數(shù)據(jù)分區(qū)指定ENDING子句,則下一個更大數(shù)據(jù)分區(qū)就必須指定STARTING子句?否則,如果未指定STARTING子句,則上一個數(shù)據(jù)分區(qū)就必須指定ENDING子句?
由于整體起始界限(1)包括端值,所以第一個數(shù)據(jù)分區(qū)(col2>= 1且col2< 11 )的起始值包括端值?同樣,由于整體結(jié)束界限(100)不包括端值,所以最后一個數(shù)據(jù)分區(qū)(col2 >= 91且col2<100)的結(jié)束界限不包括端值?其余 STARTING 值都包括端值,并且其余 ENDING 值全都不包括端值?每個數(shù)據(jù)分區(qū)都存放 n 個鍵值,其中 n 由 EVERY子句指定?由于沒有指定表空間,所以10個數(shù)據(jù)分區(qū)使用缺省表空間USERSPACE1?缺省情況下,索引將存儲在以下表空間中:USERSPACE1?
接下來我們創(chuàng)建一個稍微復(fù)雜些的示例分區(qū)表,在DB2CLP窗口中連上數(shù)據(jù)庫,發(fā)出CREATE TABLE命令,具體如清單11所示:
- - 清單11 .創(chuàng)建示例分區(qū)表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命令成功完成
命令成功完成后,這樣我們創(chuàng)建了一個示例分區(qū)表TEST2,其包含10個數(shù)據(jù)分區(qū),每個數(shù)據(jù)分區(qū)包含10個鍵值:
?
1<=AGE<11
? 11<=AGE< 21
? . . . . . . . . .
? 91 <=AGE< 100
由于沒有顯式給數(shù)據(jù)分區(qū)指定表空間,所以將使用循環(huán)法將3個表空間(TABLESPACE1,TABLESPACE2和TABLESPACE3)指定給10個數(shù)據(jù)分區(qū)?缺省情況下,索引將存儲在以下表空間中:USERSPACE1?
NULL 子句指定考慮數(shù)據(jù)分區(qū)布置時是將空值安排在高位置還是低位置?缺省情況下,將空值安排在高位置?在此情況下,將把表分區(qū)鍵列中的空值視為正無窮并放到以 MAXVALUE 結(jié)尾的范圍中?如果未定義這樣的數(shù)據(jù)分區(qū),就會將空值視為超出范圍的值?如果要排除表分區(qū)鍵列中的空值,請使用 NOT NULL約束?LAST 指定讓空值在排序的值列表中最后出現(xiàn)?FIRST 指定讓空值在排序的值列表中最先出現(xiàn)?PARTITION BY RANGE 指定表分區(qū)鍵為AGE,其后跟的NULLS LAST參數(shù)表示含有空值的數(shù)據(jù)行就會排到最后,您也可以在升序排序中使用NULLS FIRST,這樣含有空值的數(shù)據(jù)行會出現(xiàn)在第一個?
STARTING參數(shù)指定整體數(shù)據(jù)范圍從1開始,其后的INCLUSIVE參數(shù)表示端值1包含在第一個數(shù)據(jù)分區(qū)內(nèi),ENDING參數(shù)表示整體數(shù)據(jù)范圍從到100為止,其后的EXCLUSIVE表示,最后一個數(shù)據(jù)分區(qū)不包含端值100?由于整體起始界限(1)包括端值,所以第一個數(shù)據(jù)分區(qū)(AGE>= 1且AGE< 11 )的起始值包括端值?同樣,由于整體結(jié)束界限(100)不包括端值,所以最后一個數(shù)據(jù)分區(qū)(AGE>= 91且AGE<100)的結(jié)束界限不包括端值?其余 STARTING 值都包括端值,并且其余 ENDING 值全都不包括端值?每個數(shù)據(jù)分區(qū)都存放 n 個鍵值,其中 n 由 EVERY子句指定?
接下來我們創(chuàng)建示例分區(qū)表TEST3,用來對表數(shù)據(jù)進(jìn)行分區(qū)的列是RQ,表數(shù)據(jù)將存儲在下列表空間
中:TABLESPACE1,TABLESPACE2和TABLESPACE3?缺省情況下,索引將存儲在以下表空間中:USERSPACE1?大數(shù)據(jù)將存儲在下列表空間中:LARGETBS1,LARGETBS2和LARGETBS3?在DB2CLP窗口中連上數(shù)據(jù)庫,發(fā)出CREATE TABLE命令,具體如清單12所示:
- - 清單12 .自動創(chuàng)建示例分區(qū)表TEST3
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命令成功完成
此語句生成 12 個數(shù)據(jù)分區(qū),每個數(shù)據(jù)分區(qū)包含 1 個鍵值:
?
(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 ' )包括端值,所以第一個數(shù)據(jù)分區(qū)的起始值包括端值?同樣,由于整體結(jié)束界限(' 2007-12-31 ' )包括端值,所以最后一個數(shù)據(jù)分區(qū)的結(jié)束界限包括端值?其余 STARTING 值都包括端值,并且其余 ENDING 值也都包括端值?每個數(shù)據(jù)分區(qū)都存放 n 個鍵值,其中 n 由 EVERY 子句指定?使用公式 (start + every) 來確定每個數(shù)據(jù)分區(qū)的范圍末端?如果 START 到 END 的范圍無法整除 EVERY 值,最后一個數(shù)據(jù)分區(qū)包含的鍵值就會較少?
1