使用自動方法創建示例分區表
在創建示例分區表時,可以為每個數據分區指定范圍?分區表使用了數據組織方案,即,表數據根據該表中一個或多個表分區鍵列中的值分布到多個存儲對象(稱為數據分區或范圍)中?根據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
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 個數據分區,每個數據分區包含 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 ' )包括端值,所以第一個數據分區的起始值包括端值?同樣,由于整體結束界限(' 2007-12-31 ' )包括端值,所以最后一個數據分區的結束界限包括端值?其余 STARTING 值都包括端值,并且其余 ENDING 值也都包括端值?每個數據分區都存放 n 個鍵值,其中 n 由 EVERY 子句指定?使用公式 (start + every) 來確定每個數據分區的范圍末端?如果 START 到 END 的范圍無法整除 EVERY 值,最后一個數據分區包含的鍵值就會較少?
1