日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DB2 9表分区

發布時間:2023/12/29 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DB2 9表分区 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

DB2 9表分區

開始之前

CREATE TABLE 語句的 PARTITION BY 子句指定了表數據的分區。該定義中使用的列被稱為表分區鍵列。

關于該特性的詳細說明可參見 “Table partitioning in DB2 9”(developerWorks,2006 年 5 月)。

表分區特性提供以下收益:

  • 表數據可輕易實現轉入和轉出
  • 對大型表的管理更加輕松
  • 靈活的索引放置
  • 更高的業務智能樣式查詢的性能

關于本教程

本教程中的練習將引領您使用表分區特性,并演示了表數據的轉入轉出、更輕松的大型表管理、靈活的索引放置和對業務智能樣式查詢的性能改善。

這些練習旨在演示上述各領域內的一個或多個任務。

目標

本教程的目標是在以下方面探究 DB2 9 范圍分區的特性和優點:

  • 創建范圍分區表

  • 分區的轉入和轉出

  • 分區表的管理

  • 索引管理和放置

先決條件

本教程的目標讀者是那些技能和經驗剛剛邁入中級水平的 DB2 專業人員。要學習本教程,您應該熟悉 DB2 命令行、DB2 管理工具的使用,還應具備 SQL 實踐經驗。

系統需求

要運行本教程的示例,需要具備以下條件:

  • DB2 9 Data Server
  • Microsoft? Windows? 2000 或更高版本,以及一個具有管理員權限的帳戶,或具有根訪問權限的 Linux?(驗證版)。
  • 確保系統中的 Java Runtime Environment 是 1.4.2 或更高版本。
  • 參考 DB2 9 系統需求頁面 確保您的硬件符合要求。

可通過上面的鏈接獲取 DB2 9 Express C。關于安裝 DB2 的步驟請參考 “DB2 XML 評估指南”(developerWorks,2006 年 6 月)。若未改動 DB2 的配置,安裝后 DB2 將自動啟動。

使用 partition.zip 文件提供的示例腳本和數據演示本教程的概念。將其內容解壓縮到 scripts 子目錄(C:\scripts 或 home/userid/scripts)。本教程中將該目錄簡稱為 stmm_scripts。教程假設您使用的是 DB2 默認安裝目錄,并且所有的 DB2 練習都通過一個數據庫管理員 ID 執行。

創建分區表

這個實驗將探討創建分區表、將數據載入分區表以及使用 describe 命令來說明表范圍的方法:

  • 您將登錄并為所有的練習設置基本環境。
  • 您將創建不同格式的分區表并加載數據。
  • 您將使用 DB2 命令和 SQL 查看結果。
  • 將對 DB2 9 表范圍分區進行概述。
  • 登錄和基本指令

    圖 1. 基本設置

  • 登錄到您的機器,如圖 1 所示,使用 db2inst1。

  • 打開終端窗口(Linux)或 DB2 命令窗口(windows)。

  • 切換到 scripts 子目錄。

    清單 1. 切換目錄

    cd c:\scripts

  • 使用db2start 命令啟動 DB2,并連接到 SAMPLE 數據庫。

    清單 2. StartDB2
    db2start db2 connect to SAMPLE
  • 創建基本分區表

    這一節將介紹分區表的基本創建和加載。您將創建不同格式的表、驗證創建結果、加載數據并對表進行查詢。

  • 使用如下的數據定義語言(DDL)創建具有四個范圍的 LINEITEM 表:
  • 清單 3. 創建表

    CREATE TABLE LINEITEM ( l_orderkey DECIMAL(10,0) NOT NULL,l_partkey INTEGER,l_suppkey INTEGER,l_linenumber INTEGER,l_quantity DECIMAL(12,2),l_extendedprice DECIMAL(12,2),l_discount DECIMAL(12,2),l_tax DECIMAL(12,2),l_returnflag CHAR(1),l_linestatus CHAR(1),l_shipdate DATE,l_commitdate DATE,l_receiptdate DATE,l_shipinstruct CHAR(25),l_shipmode CHAR(10),l_comment VARCHAR(44))PARTITION BY RANGE(l_shipdate) ( STARTING '1/1/1992' ENDING '30/06/1992',STARTING '1/7/1992' ENDING '31/12/1992',STARTING '1/1/1993' ENDING '30/6/1993',STARTING '1/7/1993' ENDING '31/12/1993')
  • 創建該表的 SQL 語句位于 EX1-6.sql 文件中,可使用如下命令運行該文件:

    清單 4. 運行 EX1-6

    db2 –vtf EX1-6.sql

  • 使用下面的命令說明為 LINEITEM 表創建的分區的范圍:

    清單 5. 說明

    db2 describe data partitions for table LINEITEM

    圖 2. 說明為 LINEITEM 表創建的分區范圍
  • 注意:創建了四個數據分區。其中的范圍包括邊界值。

  • 將數據導入到 LINEITEM 表。該操作的導入命令位于 EX1-8.sql 文件中,可使用如下命令運行:

    清單 6. 帶有拒絕的加載

    db2 –vtf EX1-8.sql

    圖 3. 將數據導入到 LINEITEM 表
  • 注意:導入時拒絕了 729 行數據,這是因為它們不具有位于當前 LINEITEM 表的數據分區定義范圍內的 l_shipdate。

  • 標量函數可用于顯示行所屬的數據分區號(datapartitionnum)。執行以下示例 SQL 查看標量函數的輸出:

    清單 7. 查詢 - 匹配日期的分區
  • db2 “select datapartitionnum(l_shipdate) as PartitionId, l_shipdate from lineitem where l_shipdate between01/06/1992and31/07/1992order by l_shipdate”
    圖 4. 標量函數的輸出

  • 注意:標量函數(datapartitionnum)返回的值和 describe 命令返回的是同一個 PartitionId。該語句的子句間使用的謂詞范圍超出了 PartitionId 0 和 PartitionId 1 的邊界
  • 具有全部范圍的分區表

  • 創建具有兩個額外數據分區的新 LINEITEM 表,其中一個分區用來捕獲低于當前范圍的值,另一個分區用來捕獲高于當前范圍的值。首先使用下面的命令刪除現有的 LINEITEM 分區表:

    清單 8. 刪除表

    db2 drop TABLE LINEITEM

  • 然后使用如下 DDL 創建 LINEITEM 表的新版本:

    清單 9. 創建表
    CREATE TABLE LINEITEM ( l_orderkey DECIMAL(10,0) NOT NULL,l_partkey INTEGER,l_suppkey INTEGER,l_linenumber INTEGER,l_quantity DECIMAL(12,2),l_extendedprice DECIMAL(12,2),l_discount DECIMAL(12,2),l_tax DECIMAL(12,2),l_returnflag CHAR(1),l_linestatus CHAR(1),l_shipdate DATE,l_commitdate DATE,l_receiptdate DATE,l_shipinstruct CHAR(25),l_shipmode CHAR(10),l_comment VARCHAR(44))PARTITION BY RANGE(l_shipdate) ( STARTING MINVALUE,STARTING '1/1/1992' ENDING '30/06/1992',STARTING '1/7/1992' ENDING '31/12/1992',STARTING '1/1/1993' ENDING '30/6/1993',STARTING '1/7/1993' ENDING '31/12/1993',ENDING MAXVALUE)
  • 創建該表的 SQL 位于 EX1-10.sql 文件中,可使用下列命令運行:

    清單 10. 運行 EX1-10

    db2 –vtf EX1-10.sql

  • 使用下面的命令說明為 LINEITEM 表創建的分區范圍。

    清單 11. 說明

    db2 describe data partitions for table LINEITEM

    圖 5. 說明為 LINEITEM 表創建的分區范圍
  • 注意:新的 MINVALUE 范圍具有一個最高值,該值和下一個數據分區開始部分的值相等,但它并不包含該值。MAXVALUE 范圍具有一個最低值,該值和前一個范圍結束部分的值相等,但它不包含該值。這將創建一個無間隙的連續范圍。

  • 將數據導入到 LINEITEM 表中。該操作的導入命令位于 EX1-8.sql 文件中,可使用下面的命令運行該文件:

    清單 12. 全面加載

    db2 –vtf EX1-8.sql

    圖 6. 將數據導入到 LINEITEM 表中
  • 具有生成范圍的分區表

  • 創建一個新 LINEITEM 表,它具有從 1992 年 1 月 1 日到 1998 年 12 月 31 日按月劃分的數據分區生成范圍。同樣,添加 minvalue 和 maxvalue 范圍來存放具有超過此范圍的 l_shipdate 的值的行。首先使用以下命令刪除現有的 LINEITEM 分區表:

    清單 13. 刪除表

    db2 drop TABLE LINEITEM

    然后使用如下 DDL 創建 LINEITEM 表的新版本:

    清單 14. 創建表
  • CREATE TABLE lineitem (l_orderkey DECIMAL(10,0) NOT NULL,l_cpartkey INTEGER,l_suppkey INTEGER,l_linenumber INTEGER,l_quantity DECIMAL(12,2),l_extendedprice DECIMAL(12,2),l_discount DECIMAL(12,2),l_tax DECIMAL(12,2),l_returnflag CHAR(1),l_linestatus CHAR(1),l_shipdate DATE,l_commitdate DATE,l_receiptdate DATE,l_shipinstruct CHAR(25),l_shipmode CHAR(10),l_comment VARCHAR(44))PARTITION BY RANGE(l_shipdate)(STARTING MINVALUE,STARTING '1/1/1992' ENDING '31/12/1998' EVERY 1 MONTH,ENDING MAXVALUE);
  • 創建該表的 SQL 位于 EX1-13.sql 文件中,可使用下面的命令運行該文件:

    清單 15. 運行 EX1-13

    db2 –vtf EX1-13.sql

  • 使用如下命令來說明為 LINEITEM 表創建的分區范圍:

    清單 16. 說明

    db2 describe data partitions for table LINEITEM

    圖 7. 說明為 LINEITEM 表創建的分區范圍
  • 注意:創建了 86 個數據分區,但是沒有包括這些范圍的最高值,因為這些最高值將和之后的數據分區的最低值重疊。

  • 將數據導入到 LINEITEM 表。此操作的導入命令位于 EX1-8.sql 文件中,可使用下面的命令運行該文件:

    清單 17. 加載并生成

    db2 –vtf EX1-8.sql

    圖 8. 將數據導入到 LINEITEM 表
  • 使用下面的 SQL 來驗證 LINEITEM 表每一個數據分區的行數:

    清單 18. 查詢數據
    db2 “select year(l_shipdate) as year, month(l_shipdate) as month, count(*) as count from lineitemgroup by year(l_shipdate), month(l_shipdate)order by 1, 2

    使用以下的 SQL 語句驗證 LINEITEM 表的每一個數據分區的行數:

    清單 19. 查詢數據腳本
    db2 –vtf EX1-16.sql
    圖 9. 檢驗行數

  • 注意:執行加載操作后,86 個范圍中有 82 個范圍包含一個或多個行。
  • 放置分區表

    該實驗探討放置分區表以及使用 describe 命令說明表內的范圍和放置情況的方法:

  • 您將為數據放置練習創建新的表空間。
  • 你將創建不同格式的分區表。
  • 您將使用 db2 命令和 SQL 查看結果。
  • 基本環境設置

  • 使用

    describe data partitions

    命令以及

    show detail

    方法來顯示表空間的分區放置。

    清單 20. 創建表

    db2 describe data partitions for table LINEITEM show detail

    圖 10. 表空間的分區放置
  • 注意:TableSpID 列給出了包含分區的表空間的 ID 號。在本例中,TableSpID 是 ‘3’。

  • 使用

    list tablespaces

    命令標識與 TableSpId 相關聯的表空間。

    清單 21. 說明

    db2 list tablespaces

    圖 11. 標識表空間
  • 注意:相應值為 ‘2’ 的 TableSpID 是 USERSPACE1 或默認的表空間。

  • 現在將創建五個表空間來說明不同的放置選項。使用如下命令:

    清單 22. 說明
  • db2 create tablespace dms_d1 managed by database using (file 'c:\ts1' 10000); db2 create tablespace dms_d2 managed by database using (file 'c:\ts2' 10000); db2 create tablespace dms_d3 managed by database using (file 'c:\ts3' 10000); db2 create tablespace dms_d4 managed by database using (file 'c:\ts4' 10000); db2 create tablespace dms_i1 managed by database using (file 'c:\ts5' 10000);
  • 創建該表空間的 SQL 位于 EX2-3.sql 文件中,可使用下面的命令運行該文件:

    清單 23. 查詢數據腳本

    db2 –vtf EX2-3.sql

  • 創建一個新的 LINEITEM 表,具有位于 dms_d1 和 dms_d2 表空間的生成分區集。首先,使用如下命令刪除現有的 LINEITEM 分區表:

    清單 24. 刪除表

    db2 drop TABLE LINEITEM

    然后,使用下面的 DDL 創建 LINEITEM 表的新版本:

    清單 25. 創建表
  • CREATE TABLE LINEITEM (l_orderkey DECIMAL(10,0) NOT NULL,l_partkey INTEGER,l_suppkey INTEGER,l_linenumber INTEGER,l_quantity DECIMAL(12,2),l_extendedprice DECIMAL(12,2),l_discount DECIMAL(12,2),l_tax DECIMAL(12,2),l_returnflag CHAR(1),l_linestatus CHAR(1),l_shipdate DATE,l_commitdate DATE,l_receiptdate DATE,l_shipinstruct CHAR(25),l_shipmode CHAR(10),l_comment VARCHAR(44))IN DMS_D1, DMS_D2PARTITION BY RANGE(l_shipdate) (STARTING MINVALUE,STARTING '1/1/1992' ENDING '31/12/1998' EVERY 1 MONTH,ENDING MAXVALUE);
  • 創建該表的 SQL 位于 EX2-4.sql 文件中,可使用下面的命令運行該文件:

    清單 26. 運行 EX2-4

    db2 –vtf EX2-4.sql

  • 使用下面的命令說明為 LINEITEM 表創建的分區范圍:

    清單 27. 說明

    db2 describe data partitions for table LINEITEM show detail

    圖 12. 說明為 LINEITEM 表創建的分區范圍
  • 圖 13. 分區

  • 注意:TableSpID 列給出了包含分區的表空間的 ID 號。在本例中,TableSpID 為 4(對應于 DMS_D1)或 5(對應于 DMS_D2)。本例中將生成的分區依次分配給指定的表空間。
  • 分區的顯式放置

  • 創建一個具有四個數據分區的新 LINEITEM 表,每一個數據分區被顯式地放在表空間中。首先使用如下命令刪除現有的 LINEITEM 表:

    清單 28. 刪除表

    db2 drop TABLE LINEITEM

    然后使用下面的 DDL 創建 LINEITEM 表的新版本:

    清單 29. 創建表
  • CREATE TABLE LINEITEM(l_orderkey DECIMAL(10,0) NOT NULL,l_partkey INTEGER,l_suppkey INTEGER,l_linenumber INTEGER,l_quantity DECIMAL(12,2),l_extendedprice DECIMAL(12,2),l_discount DECIMAL(12,2),l_tax DECIMAL(12,2),l_returnflag CHAR(1),l_linestatus CHAR(1),l_shipdate DATE,l_commitdate DATE,l_receiptdate DATE,l_shipinstruct CHAR(25),l_shipmode CHAR(10),l_comment VARCHAR(44))PARTITION BY RANGE(l_shipdate)( STARTING MINVALUE IN DMS_D1,STARTING '1/1/1992' ENDING '31/12/1992' IN DMS_D2,STARTING '1/1/1993' ENDING '31/12/1993' IN DMS_D3,ENDING MAXVALUE IN DMS_D4 );
  • 創建表的 SQL 位于 EX2-6.sql 文件中,可使用下面的命令運行該文件:

    清單 30. 運行 EX2-6

    db2 –vtf EX2-6.sql

  • 使用下面的命令說明為 LINEITEM 表創建的分區范圍:

    清單 31. 說明

    db2 describe data partitions for table LINEITEM show detail

    圖 14. 說明為 LINEITEM 表創建的分區范圍
  • 注意:在本例中,每一個分區被放置在一個不同的 TableSpID 中,這個 TableSpID 和創建表的 DDL 中指定的表空間是相對應的。

  • 創建一個具有四個數據分區的 LINEITEM 表,每一個數據分區被顯式地放在表空間并且索引被放在表空間 DMS_I1 中。 在這一步中,將引入命名分區的概念,而不是使用默認的生成名稱。 首先,使用下面的命令刪除現有的 LINEITEM 分區表:

    清單 32. 刪除表

    db2 drop TABLE LINEITEM

    然后,使用以下的 DDL 創建 LINEITEM 表的新版本:

    清單 33. 創建表
  • CREATE TABLE LINEITEM (l_orderkey DECIMAL(10,0) NOT NULL,l_partkey INTEGER,l_suppkey INTEGER,l_linenumber INTEGER,l_quantity DECIMAL(12,2),l_extendedprice DECIMAL(12,2),l_discount DECIMAL(12,2),l_tax DECIMAL(12,2),l_returnflag CHAR(1),l_linestatus CHAR(1),l_shipdate DATE,l_commitdate DATE,l_receiptdate DATE,l_shipinstruct CHAR(25),l_shipmode CHAR(10),l_comment VARCHAR(44)) INDEX IN DMS_I1 PARTITION BY RANGE(l_shipdate) ( PART JAN1992 STARTING '1/1/1992' ENDING '30/6/1992' IN DMS_D1,PART JULY1992 STARTING '1/7/1992' ENDING '31/12/1992' IN DMS_D2,PART JAN 1993 STARTING '1/1/1993' ENDING '30/6/1993' IN DMS_D3,PART JULY1993 STARTING '1/7/1993' ENDING '31/12/1993' IN DMS_D4);
  • 創建表的 SQL 位于 EX2-8.sql 文件中,可使用下面的命令運行該文件:

    清單 34. 運行 EX2-8

    db2 –vtf EX2-8.sql

  • 在 LINEITEM 表中創建一個索引,并將它放置在表空間 DMS_I1 中。使用如下 SQL:

    清單 35. 索引

    db2 “create index I_LINEITEM on LINEITEM(L_SHIPDATE) in DMS_I1”

  • 使用下面的 SQL 檢驗和該表相關聯的索引的位置:

    清單 36. 說明

    db2 “select tabname, index_tbspace from syscat.tables where tabname = ‘LINEITEM’”

    圖 15. 檢驗索引的位置

  • 注意:索引空間是 DMS_I1。如果沒有為分區表指定表空間,那么默認情況下索引位于連接著的第一個表空間。 在 CREATE TABLE 中定義表空間是很好的實踐。然而,無論您是否在創建表語句 ID 中指定索引表空間,這并不限制您將來放置索引的位置。您可以在 CREATE INDEX 語句本身顯式地指定索引表空間。 同一分區表的不同索引可以放置在不同的表空間。

  • 管理分區表

    這個實驗將查看如何管理和操作分區表:

  • 您將添加和刪除分區。
  • 您將執行對分區的轉入轉出操作。
  • 在執行查看操作時將使用 DB2 命令和 SQL。
  • 使用現有的表添加一個新的分區

  • 將數據導入 LINEITEM 表。創建表空間的 SQL 位于 EX3-1.sql 文件中,可使用下面的命令運行該文件:

    清單 37. 導入數據

    db2 –vtf EX3-1.sql

    圖 16. 將數據導入到 LINEITEM 表
  • 注意:分區表中的記錄數,以及將進行連接和分離的記錄數對于說明數據庫中的數據何時可用非常重要。

  • 創建一個名為 NP_LINEITEM 的新表。腳本 EX3-2.sql 創建一個具有 87 行的新表 NP_LINEITEM:

    清單 38. 新分區

    db2 –vtf EX3-2.sql

    圖 17. 將數據導入到 NP_LINEITEM 表
  • 使用下面的命令說明為 LINEITEM 表創建的分區范圍:

    清單 39. 說明
    db2 describe data partitions for table LINEITEM show detail
    圖 18. LINEITEM 表的分區

  • 注意:LINEITEM 表目前包含 4 個數據分區。

  • 使用Alter語句將一個新的分區連接(轉入)到現有的 LINEITEM 表。

    清單 40. 新分區
  • ALTER TABLE LINEITEM ATTACH PARTITION JAN1994 STARTING '1/1/1994' ENDING '30/6/1994' FROM NP_LINEITEM

    可以使用以下命令運行腳本 EX3-4:

    清單 41. 新分區
    db2 –vtf EX3-4.sql
    圖 19. 腳本 EX3-4

  • 注意:LINEITEM 表被置于 SET INTEGRITY PENDING 狀態。

  • 連接后,使用

    describe data partitions

    命令來說明為 LINEITEM 表創建的分區范圍:

    清單 42. 說明

    db2 describe data partitions for table LINEITEM show detail

    圖 20. LINEITEM 表的分區
  • 注意

    :新數據分區(JAN1994)PartitionId 4 現在連接到了 LINEITEM 表。然而連接的分區的 AccessMode 值為 ‘N’ 并且 Status 的值為 ‘A’。 AccessMode 可能的值有:

    • D = 沒有數據移動
    • F = 完全訪問
    • N = 不訪問
    • R = 只讀訪問

    Status 可能的值有:

    • A = 數據分區是新連接的
    • D = 數據分區是分離的
    • I = 只有在執行異步索引清除時才對條目位于目錄的分離的數據分區進行維護;當所有引用分離數據分區的索引記錄刪除后,將刪除 STATUS 值為 ‘I’ 的行。
    • Empty string = 數據分區是可見的(普通狀態)
  • 運行兩個select count語句來檢查連接語句涉及的兩個表中數據的可用性。

    清單 43. Count Lineitem

    db2 “select count(*) from lineitem”

    圖 21. select count 語句的結果
  • [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-fHcMiLd2-1576419249173)(https://www.ibm.com/developerworks/cn/education/data/dm0612read/s25a.jpg)]

    注意:LINEITEM 表最初的分區是可用的,但是 PartitionId 4 中的新數據仍不可見。

    清單 44. Count np-lineitem
    db2 “select count(*) from np_lineitem”
    圖 22. select count 語句的結果

  • 注意:NP_LINEITEM 表現在是一個未定義的對象,在 LINEITEM 表內只能將其作為一個分區使用。

  • 創建一個異常表并與 SET INTEGRITY 語句結合使用。執行該操作的 DDL 位于 EX3-7.sql 文件,可使用下面的命令運行該文件:

    清單 45. 異常表

    db2 –vtf EX3-7.sql

  • 對 LINEITEM 分區表運行set integrity語句 。

    清單 46. 設置完整性
  • SET INTEGRITY FOR LINEITEM <br> ALLOW WRITE ACCESS <br> IMMEDIATE CHECKED <br> FOR EXCEPTION IN LINEITEM USE LINEITEM_EX

    執行該操作的 SQL 位于 EX3-8.sql 文件中,可以使用下面的命令運行該文件:

    清單 47. 設置完整性
    db2 –vtf EX3-8.sql
    圖 23. EX3-8.sql 文件

  • 注意:SET INTEGRITY 對于檢查新連接的數據是否在范圍內是必需的,它還執行對索引和其他獨立對象(例如物化查詢表)所有必需的維護工作。只有得到 SET INTEGRITY 語句的允許,新的數據才能變為可見。然而,當運行 SET INTEGRITY 時,可以對 LINEITEM 表中的現有數據進行完全訪問,包括讀和寫操作。 用戶應該執行 SET INTEGRITY 事務從而能夠使用整個表。當運行 SET INTEGRITY 時,不能夠對表執行 DDL 或其他實用類型的操作。 在這個練習中,在 NP_LINEITEM 表中創建并被連接到 LINEITEM 表的所有的行,都在連接語句指定的范圍內。如果這些行中存在超出此范圍的行,則需要在 SET INTEGRITY 語句中創建一個異常表來防止語句發生錯誤。所以推薦您始終在 SET INTEGRITY 語句中包含一個異常表。如果沒有提供異常表的話,SET INTEGRITY 語句發現的錯誤將導致語句失敗并且所有的工作都必須從頭做起。如果使用大量數據時,這可能是一個長期操作。有一點值得注意,如果 SET INTEGRITY 操作失敗,所有工作都需要重做,與之相比較,LOAD 僅僅拋棄存在問題的行。

  • 對 LINEITEM 表運行select countSQL 以檢查連接的分區中數據的可用性:

    清單 48. Count Lineitem

    db2 “select count(*) from lineitem”

    圖 24. select count 語句的結果
  • [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ReUztOvx-1576419249176)(https://www.ibm.com/developerworks/cn/education/data/dm0612read/s26b.jpg)]

  • 注意:成功執行 SET INTEGRITY 操作后,LINEITEM 表應包含 PartitionId 4 的數據。
  • 從分區表中分離一個分區

  • 使用describe data partitions show detail
    命令來標識一個分區的 PartitionName,您將把這個分區從 LINEITEM 分區表中分離(轉出)出來。

    清單 49. 說明表

    db2 describe data partitions for table LINEITEM show detail

    圖 25. LINEITEM 表的分區
  • 注意:將分離最早的分區范圍 PartitionId 0。該分區的 PartitionName 是 JAN1992。將在 DETACH 操作中使用它來標識被轉出的分區。同樣還需注意成功執行了 SET INTEGRITY 操作后,分區 JAN1994 的 AccessMode 的值為 ‘F’,Status 值為空。TableSpId、PartObjId 和 LongTblSpId 的結果可能和這里顯示的不一樣。

  • 使用

    Alter

    語句將 JAN1992 從 LINEITEM 表中分離(轉出)。

    清單 50. Alter 表

    ALTER TABLE LINEITEM DETACH PARTITION JAN1992 INTO LINEITEM_JAN1992

    創建文件的 SQL 位于 EX3-11.sql 文件中,可使用下面的命令運行該文件:

    清單 51. Alter 表

    db2 –vtf EX3-11.sql.

    注意:將 JAN1992 成功分離后,將創建一個新的表 LINEITEM_JAN1992。在DETACH操作中沒有涉及數據移動,并且位于相同表空間的新表的行為和它作為 LINEITEM 分區表的一部分時是一樣的。此時不需要對 LINEITEM 表運行SET INTEGRITY語句,因為沒有對 LINEITEM 表定義的 MQTs。 還有一點值得注意,如果從 Multi-Dimensional Clustering(MDC)分離一個分區從而創建了一個新表時,這個表也將是一個 MDC。這個規則同樣適用于下面這個情況:從一個分布式表中分離分區從而在相同的分區組創建分布式表。執行DETACH操作后產生的表使用 MDC 索引定義而不是其他的索引。對于 MDC,在首次訪問連接的表時將重新構建索引。在這種情況下,將自動對分離的分區進行索引清除操作。將從執行DETACH操作的用戶 ID 繼承索引的模式、權限和表空間。

  • 運行兩個select count語句檢查DETACH語句涉及的兩個表中的數據的可用性。

    清單 52. Count Lineitem_jan1992

    db2 “select count(*) from lineitem_jan1992”

    圖 26. select count 語句的結果
  • [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-EgIPyQFS-1576419249177)(https://www.ibm.com/developerworks/cn/education/data/dm0612read/s28a.jpg)]

    注意:創建的 LINEITEM_JAN1992 表包含 38 行,它被包含在 LINEITEM 分區表的 JAN1992 分區中。

    清單 53. Count lineitem
    db2 “select count(*) from lineitem”
    圖 27. select count 語句的結果

  • 注意:此時 LINEITEM 表完全可用,并且不包括 PART0 中的數據。

  • 當數據被移動到分區表中,或當希望將數據加載到或直接插入分區表中時,一個更合適的方法是向現有的分區表添加一個空的分區。使用下面的命令向現有的 LINEITEM 表添加一個空的分區:

    清單 54. 說明
  • db2 “ALTER TABLE LINEITEM ADD PARTITION JULY1994 STARTING '1/7/1994' ENDING '31/12/1994'
    圖 28. 向現有的 LINEITEM 表添加一個空的分區

    使用 describe data partitions show detail 命令來檢驗 PartitionName 為 JULY1994 的分區是否被添加到 LINEITEM 中:

    清單 55. 說明
    db2 describe data partitions for table LINEITEM show detail
    圖 29. LINEITEM 表的分區

    分區表的訪問計劃

    本實驗將研究如何在訪問計劃中描述分區表:

  • 您將更新分區表中的統計信息。

  • 您將使用 db2expln 命令并分析結果。

  • 您將在執行查看的操作中使用 DB2 命令和 SQL 。

  • 對 LINEITEM 表執行RUNSTATS操作:

    清單 56. Runstats

    db2 runstats on table db2inst1.lineitem

  • 說明以下 SQL 語句并檢查說明輸出:

    清單 57. 說明

    db2 “select l_shipdate,sum(l_quantity) from LINEITEM group by l_shipdate”

    要進行說明的 SQL 位于 EX4-2.sql 文件,可以使用下面的命令運行該文件:

    清單 58. 說明輸出

    db2expln –d SAMPLE –t –f EX4-2.sql

    圖 30. 說明輸出
  • [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-0PqTV96B-1576419249179)(https://www.ibm.com/developerworks/cn/education/data/dm0612read/s30.jpg)]

  • 注意:該 SQL 執行了 LINEITEM 表的索引掃描。說明輸出中有一個關于表分區的要點需要注意,所訪問的表是被分區的,并且在掃描過程中所有數據分區都將被訪問。

  • 說明下面的 SQL 語句并檢查說明輸出:

    清單 59. 說明
  • db2 “select l_shipdate, l_partkey, l_returnflag from LINEITEM where l_shipdate between '01/01/1993' and '31/08/1993' and l_partkey = 49981

    要進行說明的 SQL 語句位于 EX4-3.sql 文件中,可使用下面的命令運行該文件:

    清單 60. 說明輸出
    db2expln –d SAMPLE –t –f EX4-3.sql
    圖 31. 說明輸出

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-8wvYnGp1-1576419249180)(https://www.ibm.com/developerworks/cn/education/data/dm0612read/s31.jpg)]

  • 注意:這個 SQL 語句執行了 LINEITEM 表的索引掃描。在本例中,可以看到優化器能夠執行數據分區排除操作。在說明輸出中要注意的是關于表分區,訪問的表是被分區的,將執行分區排除功能以及刪除活動數據分區的值。 在本例中,活動的數據分區為 1-2。這里引用的是 syscat.datapartitions 中的序列號(seqno)而不是 describe data partitions 命令中的 PartitionId。

  • 使用下面的 SQL 確定在前面說明示例中活動的分區的名稱:

    清單 61. 說明
  • db2 “select seqno,datapartitionname from syscat.datapartitions where tabname = ‘LINEITEM’ order by seqno”
    圖 32. 分區名稱

  • 注意:序列號 1 和 2 分別映射的是 JAN1993 和 JULY1993 分區名稱。
  • 結束語

    本教程基于 IBM DB2 9 Data Partitioning 特性。您已在以下幾個方面獲得了第一手的經驗:

    • 如何定義分區表
    • 如何將分區表放置在底層磁盤子系統
    • 如何維護分區表
    • 如何使用 DB2 Explain 說明分區表

    范圍分區將數據映射到基于關鍵值范圍的分區,用戶為每一個分區建立關鍵值范圍。例如,企業通常希望以月份為單位,將銷售數據劃分到各月的分區中。與 MDC 功能集合使用時,范圍分區將更加方便地定位數據,從而加快通過復雜查詢檢索信息的速度。

    下載資源

    本文的示例腳本和數據 (exfiles.zip | 60KB)
    鏈接:https://pan.baidu.com/s/1cDtoMvkfUQZ_tmhHrcrocA
    提取碼:7zev

    參考

    https://www.ibm.com/developerworks/cn/education/data/dm0612read/dm0612read.html?from=singlemessage&isappinstalled=0#ibm-pcon

    總結

    以上是生活随笔為你收集整理的DB2 9表分区的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。