官术网_书友最值得收藏!

  • DB2 V9權威指南
  • 程永 王雪梅 石巖松 姜學軍
  • 9486字
  • 2019-01-01 06:20:16

2.2 DB2 V9.1表分區

2.2.1 簡介

DB2 V9新增了表分區功能,因此在DB2 V9中對一些大表不再需要分拆成小表,再用UNION ALL視圖的方式進行設計,而是直接用分區表實現這些功能。表分區功能是一種數據組織方案,即表數據根據一個或多個表列中的值分布到多個存儲對象(稱為數據分區或范圍)中。每個數據分區都是單獨存儲的。這些存儲對象可以在不同的表空間中,也可以在相同的表空間中。

在DB2 V9之前,對一些大表,出于對性能和數據容量限制的考慮,通常會把大表分拆成一些小表,再用UNION ALL視圖的方式將這些小表聯合起來。DB2 V9在數據容量方面有了重大突破,DMS表空間的新默認類型是“大型”,當使用“大型”DMS表空間時,單表的最大容量限制是16384GB,而不再是以前的512 GB。DB2 V9新增了表分區功能,使得對大表的性能和數據容量的顧慮都不再存在。使用表分區,能夠創建非常大的表,通過跨多個存儲器對象劃分表數據,可顯著增大表,一個表最多可以有32K個數據分區。使用表分區分隔數據能夠避免掃描不相關的數據,從而提高查詢處理性能。DB2優化器從查詢操作中去除不相關的分區。

表分區功能是一種數據組織方案,根據一個或多個表列中的值將表數據劃分到多個稱為數據分區或范圍的存儲對象中。每個數據分區都是單獨存儲的。這些存儲器對象可位于不同的表空間或相同的表空間中。跨多個存儲器對象對表數據進行分區的能力為數據庫管理員提供了更大的可伸縮性和靈活性,同時提高了性能和控制能力。表分區可大幅度減少管理龐大數據庫所需的維護工作,并可有效增加單個表的潛在大小。表和索引自動重組的新策略選項使用戶能夠更有效地管理DB2服務器對表和索引的自動重組。表分區使用戶能夠定義表數據的范圍,以便單獨保存每個范圍。例如,用戶可基于表中的日期列,按月對表進行分區。每個范圍(稱為數據分區)與單個存儲器對象對應。這些存儲器對象可位于不同的表空間或相同的表空間中。由于可以對單個數據分區執行管理任務,將很耗時的維護操作分成一系列較小的操作來執行,從而使管理工作更為靈活。例如,可備份和復原單個數據分區而不是整個表。DB2 V9新增的表分區功能增強了對索引位置的細化控制,可將索引置于不同表空間并單獨管理它們。使用ALTER TABLE語句的ATTACH PARTITION和DETACH PARTITION子句可方便地進行快速數據轉入或轉出。此功能在數據倉庫環境中特別有用,在此環境中經常需要裝入或刪除數據以運行決策支持查詢,并且此功能能夠將表分區與其他數據組織方案組合在一起。通過將表分區與數據分區功能(DPF)一起使用,可跨數據庫分區均勻地分布數據范圍,以利用DPF的查詢內并行性和數據庫分區負載均衡功能。將表分區與多維集群(MDC)一起使用時,能夠對同一表擴展數據塊中在多個維上具有類似值的行進行分組。

將按照下列順序介紹表分區。

1.創建示例數據庫DB2TEST1,在示例數據庫上創建一個使用32K頁大小的緩沖池,創建3個DMS表空間,用來存放示例分區表的數據,創建3個大型表空間(DMS),用來存放示例分區表的大型數據,創建1個DMS表空間,用來存放示例分區表的索引。

2.使用自動方式創建示例分區表。

3.使用手工方式創建示例分區表。

2.2.2 創建示例數據庫DB2TEST1

首先在Windows XP環境下安裝DB2 ESE V9.1,安裝完成后,打開DB2CLP命令窗口,創建示例數據庫DB2TEST1。在DB2命令窗口中,發出CREATE DATABASE語句,創建示例數據庫,具體如清單2-23所示。

清單2-23 創建示例數據庫DB2TEST1

        C:\> DB2 CREATE DATABASE DB2TEST1
        DB20000I  CREATE DATABASE命令成功完成。

這樣創建了一個示例數據庫DB2TEST1。查看其數據庫配置參數,數據庫代碼頁是1386,數據庫地域是CN,數據庫代碼集是GBK,具體如清單2-24所示。

清單2-24 查看示例數據庫DB2TEST1配置參數

        C:\> db2 get db cfg for db2test1
              數據庫db2test1 的數據庫配置
        數據庫配置發行版級別                             =0x0b00
        數據庫發行版級別                                 =0x0b00
        數據庫地域                                       =CN
        數據庫代碼頁                                     =1386
        數據庫代碼集                                     =GBK
        數據庫國家/地區代碼                              =86
        數據庫整理順序                                   =UNIQUE
        備用整理順序                        ( ALT_COLLATE )=
        數據庫頁大小                                     =4096
        . . . . . . . . . . . . . . . . . .

接下來查看一下示例數據庫DB2TEST1上的表空間情況,在DB2CLP窗口中,連上示例數據庫DB2TEST1,使用LIST TABLESPACES命令能夠看到創建示例數據庫時已經默認創建了3個表空間:SYSCATSPACE、TEMPSPACE1、USERSPACE1,都是使用自動存儲管理,具體如清單2-25所示。

清單2-25 查看示例數據庫DB2TEST1表空間情況

        C:\> DB2 CONNECT TO DB2TEST1
          數據庫連接信息
        數據庫服務器      =DB2 / NT 9.1.0
         SQL授權標識      =RHETTE
        本地數據庫別名    =DB2TEST1
        C:\> db2 list tablespaces show detail
            當前數據庫的表空間
        表空間標識                   =0
        名稱                         =SYSCATSPACE
        類型                         =數據庫管理空間
        內容                         =所有持久數據。常規表空間。
        狀態                         =0x0000
        詳細解釋:
          正常
        總計頁數                        =8192
        可用頁數                        =8188
        已用頁數                        =7924
        可用頁數                        =264
        高水位標記(頁)                =7924
        頁大小(以字節計)              =4096
        擴展數據塊大小(頁)            =4
        預取大小(頁)                  =4
        容器數                          =1
        表空間標識                      =1
        名稱                            =TEMPSPACE1
        類型                            =系統管理空間
        內容                            =系統臨時數據
        狀態                            =0x0000
        詳細解釋:
          正常
        總計頁數                        =1
        可用頁數                        =1
        已用頁數                        =1
        可用頁數                        =不適用
        高水位標記(頁)                =不適用
        頁大小(以字節計)              =4096
        擴展數據塊大小(頁)            =32
        預取大小(頁)                  =32
        容器數                          =1
        表空間標識                      =2
        名稱                        =USERSPACE1
        類型                            =數據庫管理空間
        內容                            =所有持久數據。大型表空間。
        狀態                            =0x0000
        詳細解釋:
          正常
        總計頁數                        =8192
        可用頁數                        =8160
        已用頁數                        =96
        可用頁數                        =8064
        高水位標記(頁)                =96
        頁大小(以字節計)           =4096
        擴展數據塊大小(頁)            =32
        預取大小(頁)                  =32
        容器數                          =1

接下來再查看一下示例數據庫的緩沖池情況,在DB2CLP窗口中通過查看系統表SYSIBM.SYSBUFFERPOOLS可以看到,在創建示例數據庫時默認創建的4K頁大小緩沖池IBMDEFAULTBP,具體如清單2-26所示。

清單2-26 查看默認創建緩沖池情況

        C:\> DB2 CONNECT TO DB2TEST1
          數據庫連接信息
        數據庫服務器      =DB2 / NT 9.1.0
         SQL授權標識      =RHETTE
        本地數據庫別名    =DB2TEST1
        C:\> db2 " select BPNAME , NPAGES from sysibm.sysbufferpools "
        BPNAME                                 NPAGES
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        IBMDEFAULTBP                              -2
          1 條記錄已選擇。

當緩沖池啟用了自調整功能時,該特定緩沖池的SYSIBM.SYSBUFFERPOOLS表中的NPAGES字段將設置為-2。當自調整功能處于禁用狀態時,NPAGES字段將設置為緩沖池的當前大小。可以在清單2-26中看到,IBMDEFAULTBP的NPAGES字段將設置為-2,由此可以確定,IBMDEFAULTBP啟用了自調整功能。

下面創建32K頁大小的示例緩沖池MYBP1,其使用自調整功能(注意其CREATE BUFFERPOOL語句使用了AUTOMATIC),初始大小3.2MB,具體如清單2-27所示。

清單2-27 創建使用自動自調整功能的示例緩沖池MYBP1

        C:\> db2 create bufferpool mybp1 immediate size 100  automatic  pagesize 32k
        DB20000I  SQL命令成功完成。

接下來在示例數據庫DB2TEST1中創建3個4K頁大小的DMS表空間,用來存放示例分區表的數據,名稱分別為TABLESPACE1、TABLESPACE2和TABLESPACE3。在DB2CLP窗口中,發出CREATE TABLESPACE命令,其緩沖池使用數據庫默認創建的4K頁大小的緩沖池IBMDEFAULTBP,具體如清單2-28所示。

清單2-28 創建DMS示例表空間

        C:\> DB2 CREATE  REGULAR  TABLESPACE TABLESPACE1 PAGESIZE 4 K  MANAGED BY AUTOMATIC STORAGE
    BUFFERPOOL  IBMDEFAULTBP
        DB20000I  SQL命令成功完成。
        C:\> DB2 CREATE  REGULAR  TABLESPACE TABLESPACE2 PAGESIZE 4 K  MANAGED BY AUTOMATIC STORAGE
    BUFFERPOOL  IBMDEFAULTBP
        DB20000I  SQL命令成功完成。
        C:\> DB2 CREATE  REGULAR  TABLESPACE TABLESPACE3 PAGESIZE 4 K  MANAGED BY AUTOMATIC STORAGE
    BUFFERPOOL  IBMDEFAULTBP
        DB20000I  SQL命令成功完成。

注意,在MANAGED BY后面跟的是AUTOMATIC STORAGE,表示新創建的表空間將使用自動存儲。如果新建的表空間使用DB2管理存儲器(自動存儲器),根據要創建的表空間類型不同,其空間管理會有所區別,當其表空間類型是常規或者大型時,將自動創建成數據庫管理空間(DMS),當其表空間類型是系統臨時或者用戶臨時時,將自動創建成系統管理空間(SMS)。使用自動存儲,就不再需要擔心如何添加容器以及監控容器的增長等,自動存儲會自動增加表空間在磁盤和文件系統上的大小。在DB2CLP窗口中輸入LIST TABLESPACE命令,可以看到3個示例表空間TABLESPACE1、TABLESPACE2和TABLESPACE3已經創建成功,其空間管理類型是數據庫管理空間,具體如清單2-29所示。

清單2-29 查看示例表空間

        C:\> db2 list tablespaces show detail
                  當前數據庫的表空間
         . . . . . . . . . . . . . . . . . . . .
        表空間標識                    =4
        名稱                          =TABLESPACE1
        類型                          =數據庫管理空間
        內容                          =所有持久數據。常規表空間。
        狀態                          =0x0000
        詳細解釋:
            正常
        總計頁數                      =8192
        可用頁數                      =8160
        已用頁數                      =96
        可用頁數                      =8064
        高水位標記(頁)              =96
        頁大小(以字節計)            =4096
        擴展數據塊大小(頁)          =32
        預取大小(頁)                =32
        容器數                        =1
        表空間標識                    =5
        名稱                          =TABLESPACE2
        類型                          =數據庫管理空間
        內容                          =所有持久數據。常規表空間。
        狀態                          =0x0000
        詳細解釋:
            正常
        總計頁數                      =8192
        可用頁數                      =8160
        已用頁數                      =96
        可用頁數                      =8064
        高水位標記(頁)              =96
        頁大小(以字節計)            =4096
        擴展數據塊大小(頁)          =32
        預取大小(頁)                =32
        容器數                        =1
        表空間標識                    =6
        名稱                          =TABLESPACE3
        類型                          =數據庫管理空間
        內容                          =所有持久數據。常規表空間。
        狀態                          =0x0000
        詳細解釋:
            正常
        總計頁數                      =8192
        可用頁數                      =8160
        已用頁數                      =96
        可用頁數                      =8064
        高水位標記(頁)              =96
        頁大小(以字節計)            =4096
        擴展數據塊大小(頁)          =32
        預取大小(頁)                =32
        容器數                        =1

接下來創建3個32K頁大小的大型表空間,其緩沖池使用新創建的示例緩沖池MYBP1,大型表空間的名稱分別為LARGETBS1、LARGETBS2和LARGETBS3。在DB2CLP窗口中,發出CREATE LARGE TABLESPACE命令,具體如清單2-30所示。

清單2-30 創建大型示例表空間LARGETBS1、LARGETBS2和LARGETBS3

        C:\> DB2 CREATE  LARGE  TABLESPACE LARGETBS1 PAGESIZE 32 K  MANAGED BY AUTOMATIC STORAGE
    BUFFERPOOL  MYBP1
        DB20000I  SQL命令成功完成。
        C:\> DB2 CREATE  LARGE  TABLESPACE LARGETBS2 PAGESIZE 32 K  MANAGED BY AUTOMATIC STORAGE
    BUFFERPOOL  MYBP1
        DB20000I  SQL命令成功完成。
        C:\> DB2 CREATE  LARGE  TABLESPACE LARGETBS3 PAGESIZE 32 K  MANAGED BY AUTOMATIC STORAGE
    BUFFERPOOL  MYBP1
        DB20000I  SQL命令成功完成。

在DB2CLP窗口中輸入LIST TABLESPACE命令,可以看到3個大型示例表空間LARGETBS1、LARGETBS2和LARGETBS3已經創建成功,其空間管理類型是數據庫管理空間,具體如清單2-31所示。

清單2-31 查看示例表空間

        C:\> db2 list tablespaces show detail
                  當前數據庫的表空間
         . . . . . . . . . . . . . . . . . . . .
        表空間標識                     =7
        名稱                       =LARGETBS1
        類型                       =數據庫管理空間
        內容                       =所有持久數據。大型表空間。
        狀態                           =0x0000
        詳細解釋:
            正常
        總計頁數                       =1024
        可用頁數                       =992
        已用頁數                       =96
        可用頁數                       =896
        高水位標記(頁)               =96
        頁大小(以字節計)             =32768
        擴展數據塊大小(頁)           =32
        預取大小(頁)                 =32
        容器數                         =1
        表空間標識                     =8
        名稱                       =LARGETBS2
        類型                       =數據庫管理空間
        內容                       =所有持久數據。大型表空間。
        狀態                           =0x0000
        詳細解釋:
            正常
        總計頁數                       =1024
        可用頁數                       =992
        已用頁數                       =96
        可用頁數                       =896
        高水位標記(頁)               =96
        頁大小(以字節計)             =32768
        擴展數據塊大小(頁)           =32
        預取大小(頁)                 =32
        容器數                         =1
        表空間標識                     =9
        名稱                       =LARGETBS3
        類型                       =數據庫管理空間
        內容                       =所有持久數據。大型表空間。
        狀態                           =0x0000
        詳細解釋:
            正常
        總計頁數                       =1024
        可用頁數                       =992
        已用頁數                       =96
        可用頁數                       =896
        高水位標記(頁)               =96
        頁大小(以字節計)             =32768
        擴展數據塊大小(頁)           =32
        預取大小(頁)                 =32
        容器數                         =1

2.2.3 使用自動方法創建示例分區表

在創建示例分區表時,可以為每個數據分區指定范圍。分區表使用了數據組織方案,即表數據根據該表中一個或多個表分區鍵列中的值分布到多個存儲對象(稱為數據分區或范圍)中。根據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命令,具體如清單2-32所示。

清單2-32 創建示例分區表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

21<=COL2<31

31<=COL2<41

41<=COL2<51

51<=COL2<61

61<=COL2<71

71<=COL2<81

81<=COL2<91

91<=COL2<100

STARTING子句指定數據分區范圍的下界。對于最低數據分區范圍來說,此子句是必需的(盡管可以將邊界定義為MINVALUE)。INCLUSIVE表示將所有等于指定值的值都包括在包含此邊界的數據分區中。最低數據分區范圍是具有最低指定邊界的數據分區。清單2-32中STARTING參數指定整體數據范圍從1開始,其后的INCLUSIVE參數表示端值1包含在第一個數據分區內。

ENDING(或VALUES)子句指定數據分區范圍的上界。對于最高數據分區范圍來說,此子句是必需的(盡管可以將邊界定義為MAXVALUE)。最高數據分區范圍是具有最高指定邊界的數據分區。EXCLUSIVE表示所有等于指定值的值都不包括在包含此邊界的數據分區中。清單2-32中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命令,具體如清單2-33所示。

清單2-33 創建示例分區表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

21<=AGE<31

31<=AGE<41

41<=AGE<51

51<=AGE<61

61<=AGE<71

71<=AGE<81

81<=AGE<91

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命令,具體如清單2-34所示。

清單2-34 自動創建示例分區表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-03-01 '),(RQ)<(' 2007-04-01 ')

(RQ)>=(' 2007-04-01 '),(RQ)<(' 2007-05-01 ')

(RQ)>=(' 2007-05-01 '),(RQ)<(' 2007-06-01 ')

(RQ)>=(' 2007-06-01 '),(RQ)<(' 2007-07-01 ')

(RQ)>=(' 2007-07-01 '),(RQ)<(' 2007-08-01 ')

(RQ)>=(' 2007-08-01 '),(RQ)<(' 2007-09-01 ')

(RQ)>=(' 2007-09-01 '),(RQ)<(' 2007-10-01 ')

(RQ)>=(' 2007-10-01 '),(RQ)<(' 2007-11-01 ')

(RQ)>=(' 2007-11-01 '),(RQ)<(' 2007-12-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值,最后一個數據分區包含的鍵值就會較少。

2.2.4 使用手工方式創建示例分區表

手工生成方法為PARTITION BY子句中列示的每個范圍創建一個新數據分區。這種語法格式提高了定義范圍時的靈活性,從而增加了數據和LOB布置選項。對清單2-34所創建的示例分區表TEST3,如果用手工方式創建,可以在DB2CLP窗口中,連上數據庫,先發出DROP TABLE命令,刪除示例分區表TEST3,再發出CREATE TABLE命令創建示例分區表TEST3,其分區鍵RQ允許錄入的時間段為“2007-01-01”到“2007-12-31”,具體如清單2-35所示。

清單2-35 手工創建示例分區表TEST3

        C:\> DB2 CONNECT TO DB2TEST1
          數據庫連接信息
        數據庫服務器      =DB2 / NT 9.1.0
         SQL授權標識      =RHETTE
        本地數據庫別名    =DB2TEST1
        C:\> db2 drop table test3
        DB20000I  SQL命令成功完成。
        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)  (PARTITION DATAPATITION1
    STARTING FROM ('2007-01-01') INCLUSIVE ENDING AT ('2007-02-01') EXCLUSIVE IN TABLESPACE1 LONG
    IN LARGETBS1 , PARTITION DATAPATITION2 STARTING FROM ('2007-02-01') INCLUSIVE ENDING AT
    ('2007-03-01') EXCLUSIVE IN TABLESPACE2 LONG IN LARGETBS2,PARTITION DATAPATITION3 STARTING FROM
    ('2007-03-01') INCLUSIVE ENDING AT ('2007-04-01') EXCLUSIVE IN TABLESPACE3 LONG IN
    LARGETBS3,PARTITION DATAPATITION4 STARTING FROM ('2007-04-01') INCLUSIVE ENDING AT
    ('2007-05-01') EXCLUSIVE IN TABLESPACE1 LONG IN LARGETBS1,PARTITION DATAPATITION5 STARTING FROM
    ('2007-05-01') INCLUSIVE ENDING AT ('2007-06-01') EXCLUSIVE IN TABLESPACE2 LONG IN
    LARGETBS2 ,PARTITION DATAPATITION6 STARTING FROM ('2007-06-1') INCLUSIVE ENDING AT ('2007-07-1')
    EXCLUSIVE IN TABLESPACE3 LONG IN LARGETBS3 , PARTITION DATAPATITION7 STARTING FROM ('2007-07-01')
    INCLUSIVE ENDING AT ('2007-08-01') EXCLUSIVE IN TABLESPACE1 LONG IN LARGETBS1,  PARTITION
    DATAPATITION8 STARTING FROM ('2007-08-01') INCLUSIVE ENDING AT ('2007-09-01') EXCLUSIVE IN
    TABLESPACE2 LONG IN LARGETBS2 , PARTITION DATAPATITION9 STARTING FROM ('2007-09-01') INCLUSIVE
    ENDING AT ('2007-10-01') EXCLUSIVE IN TABLESPACE3 LONG IN LARGETBS3,PARTITION DATAPATITION10
    STARTING FROM ('2007-10-01') INCLUSIVE ENDING AT ('2007-11-01') EXCLUSIVE IN TABLESPACE1 LONG
    IN LARGETBS1,PARTITION DATAPATITION11 STARTING FROM ('2007-11-01') INCLUSIVE ENDING AT
    ('2007-12-01') EXCLUSIVE IN TABLESPACE2 LONG IN LARGETBS2,PARTITION DATAPATITION12 STARTING
    FROM ('2007-12-01') INCLUSIVE ENDING AT ('2007-12-31') INCLUSIVE IN TABLESPACE3 LONG IN LARGETBS3)
    INDEX IN USERSPACE1
        DB20000I  SQL命令成功完成。

這樣通過手工方式創建了示例分區表TEST3,用來對表數據進行分區的列是RQ,表數據將存儲在TABLESPACE1、TABLESPACE2和TABLESPACE3表空間中。默認情況下,索引將存儲在USERSPACE1表空間中。此語句生成12個數據分區,每個數據分區包含1個鍵值。

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

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

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

(RQ)>=(' 2007-04-01 '),(RQ)<(' 2007-05-01 ')

(RQ)>=(' 2007-05-01 '),(RQ)<(' 2007-06-01 ')

(RQ)>=(' 2007-06-01 '),(RQ)<(' 2007-07-01 ')

(RQ)>=(' 2007-07-01 '),(RQ)<(' 2007-08-01 ')

(RQ)>=(' 2007-08-01 '),(RQ)<(' 2007-09-01 ')

(RQ)>=(' 2007-09-01 '),(RQ)<(' 2007-10-01 ')

(RQ)>=(' 2007-10-01 '),(RQ)<(' 2007-11-01 ')

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

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

每個數據分區通過PARTITION命令進行了命名,名字分別為DATAPARTITION1,DATAPARTITION2,…,DATAPARTITION12。接下來對示例分區表TEST3插入數據,在DB2CLP窗口中,發出INSERT INTO命令,具體如清單2-36所示。

清單2-36 對示例分區表TEST3插入一條記錄

        C:\> DB2 INSERT INTO TEST3 VALUES ( 1 , '2007-01-10' , blob ( 'the first rows' ) )
        DB20000I  SQL命令成功完成。

命令成功完成,把行插入示例分區表時,根據該行的鍵值以及它所處的范圍自動將其放入正確的數據分區,這樣數據就插入到了數據分區DATAPARTITION1中。如果該行處于對該表定義的所有范圍之外,插入就會失敗,并且將把錯誤返回給應用程序。比如插入一條具體如清單2-37所示的記錄,RQ的值為'2006-01-10',不在'2007-01-01'和'2007-12-31'的范圍內。

清單2-37 對示例分區表TEST3插入一條分區鍵范圍外的記錄

        C:\> DB2 INSERT INTO TEST3 VALUES (1 , '2006-01-10' , blob ( 'the first rows' ) )
        DB21034E  該命令被當做SQL語句來處理,因為它不是有效的“命令行處理器”命令。在SQL處理期間,它返回:
        SQL0327N  無法將行插入表 " RHETTE.TEST3 " 中,因為它在定義的數據分區范圍之外。
        SQLSTATE=22525

此時查看示例分區表中的記錄,通過在WHERE子句中指定分區鍵的值,可以避免掃描不相關的數據,直接從DATAPARTITION1數據分區中得到想要的記錄,從而提高查詢處理性能,具體如清單2-38所示。

清單2-38 查詢示例分區表TEST3

        C:\> db2 select id,rq from test3 where rq='2007-01-10'
        ID         RQ
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                12007-01-10
          1 條記錄已選擇。

如果想在范圍之間允許存在間隔,可以使用MINVALUE和MAXVALUE指定間隔的范圍,MINVALUE表示最小的值,就是比插入的任何值都會小,MAXVALUE表示最大的值,就是比插入的任何值都要大。對示例分區表TEST3,可以增加兩個數據分區:

數據分區OTHERS1,范圍從MINVALUE到 ' 2007-01-01',不包含 ' 2007-01-01';所有比' 2007-01-01 '小的值,都會放入到此分區中。

數據分區OTHERS2,范圍從 ' 2008-01-01' 到MAXVALUE,包含' 2008-01-01';所有比' 2008-01-01' 大的值,都會放入到此分區中。具體如清單2-39中著重標記部分所示。

清單2-39 手工創建示例分區表TEST3

        C:\> db2 drop table test3
        DB20000I  SQL命令成功完成。
        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)  (PARTITION DATAPATITION1
    STARTING FROM ('2007-01-01') INCLUSIVE ENDING AT ('2007-02-01') EXCLUSIVE IN TABLESPACE1 LONG
    IN LARGETBS1 , PARTITION DATAPATITION2 STARTING FROM ('2007-02-01') INCLUSIVE ENDING AT
    ('2007-03-01') EXCLUSIVE IN TABLESPACE2 LONG IN LARGETBS2,PARTITION DATAPATITION3 STARTING FROM
    ('2007-03-01') INCLUSIVE ENDING AT ('2007-04-01') EXCLUSIVE IN TABLESPACE3 LONG IN LARGETBS3,
    PARTITION DATAPATITION4 STARTING FROM ('2007-04-01') INCLUSIVE ENDING AT ('2007-05-01')
    EXCLUSIVE IN TABLESPACE1 LONG IN LARGETBS1, PARTITION DATAPATITION5 STARTING FROM ('2007-05-01')
    INCLUSIVE ENDING AT ('2007-06-01') EXCLUSIVE IN TABLESPACE2 LONG IN LARGETBS2 ,PARTITION
    DATAPATITION6 STARTING FROM ('2007-06-1') INCLUSIVE ENDING AT ('2007-07-1') EXCLUSIVE IN
    TABLESPACE3 LONG IN LARGETBS3 , PARTITION DATAPATITION7 STARTING FROM ('2007-07-01') INCLUSIVE
    ENDING AT ('2007-08-01') EXCLUSIVE IN TABLESPACE1 LONG IN LARGETBS1 ,  PARTITION DATAPATITION8
    STARTING FROM ('2007-08-01') INCLUSIVE ENDING AT ('2007-09-01') EXCLUSIVE IN TABLESPACE2 LONG
    IN LARGETBS2 , PARTITION DATAPATITION9 STARTING FROM ('2007-09-01') INCLUSIVE ENDING AT
    ('2007-10-01') EXCLUSIVE IN TABLESPACE3 LONG IN LARGETBS3 , PARTITION DATAPATITION10 STARTING
    FROM ('2007-10-01') INCLUSIVE ENDING AT ('2007-11-01') EXCLUSIVE IN TABLESPACE1 LONG IN
    LARGETBS1 , PARTITION DATAPATITION11 STARTING FROM ('2007-11-01') INCLUSIVE ENDING AT
    ('2007-12-01') EXCLUSIVE IN TABLESPACE2 LONG IN LARGETBS2 , PARTITION DATAPATITION12 STARTING
    FROM ('2007-12-01') INCLUSIVE ENDING AT ('2007-12-31') INCLUSIVE IN TABLESPACE3 LONG IN
    LARGETBS3 ,PARTITION OTHERS1 STARTING FROM (MINVALUE) EXCLUSIVE ENDING AT ('2007-01-01')
    EXCLUSIVE IN TABLESPACE1 LONG IN LARGETBS1 , PARTITION OTHERS2 STARTING FROM ('2008-01-01')
    INCLUSIVE ENDING AT (MAXVALUE) EXCLUSIVE IN TABLESPACE2 LONG IN LARGETBS2 ) INDEX IN USERSPACE1
        DB20000I  SQL命令成功完成。

此時再次插入清單2-37中所插入的值,就可以成功了,具體如清單2-40所示。

清單2-40 對示例分區表TEST3插入一條記錄

        C:\> DB2 INSERT INTO TEST3 VALUES (1,'2006-01-10' , blob ( ' the first rows ' ) )
        DB20000I  SQL命令成功完成。

把清單2-32中數值型的列作為表分區鍵,也可以用手工的方式進行創建,具體如清單2-41所示。

清單2-41 創建示例分區表TEST4

        C:\> DB2 CREATE TABLE RHETTE.TEST4 ( COL1 INTEGER  NOT NULL , COL2 BIGINT  NOT NULL   )
    PARTITION BY RANGE ( COL2 NULLS LAST )  ( PARTITION DATAPARTION1 STARTING FROM ( 1 ) INCLUSIVE
    ENDING AT ( 10 ) INCLUSIVE IN TABLESPACE1 , PARTITION DATAPARTITION2 STARTING FROM ( 11 ) INCLUSIVE
    ENDING AT ( 20 ) INCLUSIVE )
        DB20000I  SQL命令成功完成。

使用手工方式創建分區表可以將多個列用做表分區鍵,比如在DB2CLP窗口中創建示例分區表TEST5,具體如清單2-42所示。

清單2-42 創建示例分區表TEST5

        C:\> DB2 CREATE TABLE TEST5 ( year INT , month INT ) PARTITION BY RANGE( year , month )
    ( STARTING FROM ( 2007 , 1 ) ENDING ( 2007 , 3 ) IN TABLESPACE1 , ENDING ( 2007 , 6 ) IN TABLESPACE2 ,
    ENDING ( 2007 , 9 )  IN TABLESPACE3 )
        DB20000I  SQL命令成功完成。

命令成功完成。這樣就成功創建了示例分區表TEST5,其包含3個數據分區,即2007年前3個季度,每個季度一個數據分區。需要注意的是,當將多個列用做表分區鍵時,將把這些列視為組合鍵(類似于索引中的組合鍵),其中,后面的列依賴于前面的列。指定的每個起始值或結束值(所有列一起)不能超出512個字符。此限制與SYSCAT.DATAPARTITIONS目錄視圖中的LOWVALUE和HIGHVALUE列大小對應。如果指定超出512個字符的起始值或結束值,就會導致錯誤SQL0636N,原因碼為9。表分區是多列的,而不是多維的。在表分區中,使用的所有列都包含在單個維中。

另外,還可以將生成列用做表分區鍵。接下來在DB2CLP窗口中,創建示例分區表TEST6,其包含12個數據分區的表,即每個月一個數據分區。對于任何年份,一月份的所有行都將被放到第一個數據分區中,二月份的行將被放到第二個數據分區中,依此類推,具體如清單2-43所示。

清單2-43 創建示例分區表TEST6

        C:\> DB2 CREATE TABLE TEST6 ( RQ date,YF int GENERATED ALWAYS AS ( month( RQ ) ) ) PARTITION
    BY RANGE ( YF ) (STARTING FROM 1 ENDING AT 12 EVERY 1 )
        DB20000I  SQL命令成功完成。

命令成功完成。這樣成功創建了示例分區表TEST6,需要注意的是對于表分區鍵中使用的生成列,不能改變或刪除其表達式。不允許對表分區鍵中使用的列添加生成列表達式。對于表分區鍵中使用的列,如果嘗試添加、刪除或改變該列的生成列表達式,就會導致錯誤(SQL0270N,原因碼為52)。

主站蜘蛛池模板: 桃源县| 朝阳区| 崇州市| 临安市| 托克托县| 安达市| 抚顺县| 呼伦贝尔市| 五家渠市| 宁陕县| 民乐县| 壤塘县| 右玉县| 台中县| 长春市| 沙坪坝区| 青州市| 镇安县| 隆昌县| 高碑店市| 尉犁县| 衢州市| 碌曲县| 称多县| 小金县| 阳城县| 吐鲁番市| 故城县| 甘谷县| 太白县| 册亨县| 耒阳市| 盐池县| 大田县| 长武县| 交口县| 双流县| 叶城县| 上饶市| 阿拉善右旗| 曲阳县|