DB2 V9表分割槽(三)

rheet1978發表於2008-07-21
使用自動方法建立示例分割槽表

        在建立示例分割槽表時,可以為每個資料分割槽指定範圍。分割槽表使用了資料組織方案,即,表資料根據該表中一個或多個表分割槽鍵列中的值分佈到多個儲存物件(稱為資料分割槽或範圍)中。根據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個鍵值:

l         1<=COL2<11

l         11<=COL2< 21

l          . . . . . .

l         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個鍵值:

l         1<=AGE<11

l         11<=AGE< 21

l          . . . . . . . . .

l         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 個鍵值:

l         (RQ) >= ( ' 2007-01-01 ' ) , (RQ) < (' 2007-02-01 ' )

l         (RQ) >= ( ' 2007-02-01 ' ) , (RQ) < (' 2007-03-01 ' )

l         . . . . . .

l         (RQ) >= ( ' 2007-12-01 ' ) , (RQ) <= (' 2007-12-31 ' )

        由於整體起始界限( ' 2007-01-01 ' )包括端值,所以第一個資料分割槽的起始值包括端值。同樣,由於整體結束界限(' 2007-12-31 ' )包括端值,所以最後一個資料分割槽的結束界限包括端值。其餘 STARTING 值都包括端值,並且其餘 ENDING 值也都包括端值。每個資料分割槽都存放 N 個鍵值,其中 N 由 EVERY 子句指定。使用公式 (START + EVERY) 來確定每個資料分割槽的範圍末端。如果 START 到 END 的範圍無法整除 EVERY 值,最後一個資料分割槽包含的鍵值就會較少。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9524210/viewspace-405456/,如需轉載,請註明出處,否則將追究法律責任。

相關文章