DB2 9 表分區
改進大型資料庫的管理
Paul Read ([email protected]),産品推介經理, EMC
Richard Hewitt ([email protected]), DB2 顧問, IBM UK
Paul Read,産品推介經理, EMC
Richard Hewitt,DB2顧問, IBM UK
簡介: 本教程旨在示範DB2® 9 中的範圍分區(Range Partitioning)功能。讀者将獲得對 DB2 表範圍分區特性的第一手體驗。表分區是一種資料組織模式,在這種模式中,資料将以一個或多個表列的值為依據,分割到多個稱為資料分區(或範圍)的存儲對象中。每一個資料分區被分别存儲。這些存儲對象可以位于不同的表空間中,可以位于相同的表空間中,也可能是這兩種情況的組合。
标記本文!
釋出日期: 2007 年 10 月 29 日
級别: 中級
通路情況 : 13556次浏覽
評論: 0 (添加評論)
平均分 (共17個評分 )
開始之前
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 RuntimeEnvironment是 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指令來說明表範圍的方法:
1 您将登入并為所有的練習設定基本環境。
2 您将建立不同格式的分區表并加載資料。
3 您将使用 DB2指令和 SQL 檢視結果。
4 将對 DB2 9表範圍分區進行概述。
登入和基本指令
圖 1. 基本設定
5 登入到您的機器,如圖1所示,使用 db2inst1。
6 打開終端視窗(Linux)或 DB2 指令視窗(windows)。
切換到 scripts子目錄。 清單 1. 切換目錄 cd /scripts or 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 between ’01/06/1992’ and ‘31/07/1992’ order 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 lineitem group by year(l_shipdate), month(l_shipdate) order by 1, 2” |
使用以下的 SQL 語句驗證 LINEITEM 表的每一個資料分區的行數: 清單 19. 查詢資料腳本 db2 –vtf EX1-16.sql |
圖 9. 檢驗行數
注意:執行加載操作後,86個範圍中有 82個範圍包含一個或多個行。
放置分區表
該實驗探讨放置分區表以及使用 describe指令說明表内的範圍和放置情況的方法:
1 您将為資料放置練習建立新的表空間。
2 你将建立不同格式的分區表。
3 您将使用 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_D2 PARTITION 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 中指定索引表空間,這并不限制您将來放置索引的位置。您可以在 CREATEINDEX 語句本身顯式地指定索引表空間。 同一分區表的不同索引可以放置在不同的表空間。
管理分區表
這個實驗将檢視如何管理和操作分區表:
1 您将添加和删除分區。
2 您将執行對分區的轉入轉出操作。
3 在執行檢視操作時将使用 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表被置于 SETINTEGRITY PENDING 狀态。
連接配接後,使用 describe data partitions指令來說明為 LINEITEM 表建立的分區範圍: 清單 42. 說明 db2 describe data partitions for table LINEITEM show detail |
圖 20.LINEITEM表的分區
注意:新資料分區(JAN1994)PartitionId4 現在連接配接到了 LINEITEM 表。然而連接配接的分區的AccessMode 值為 ‘N’ 并且 Status 的值為 ‘A’。 AccessMode 可能的值有:
o D =沒有資料移動
o F =完全通路
o N =不通路
o R =隻讀通路
Status可能的值有:
o A =資料分區是新連接配接的
o D =資料分區是分離的
o I =隻有在執行異步索引清除時才對條目位于目錄的分離的資料分區進行維護;當所有引用分離資料分區的索引記錄删除後,将删除 STATUS值為 ‘I’ 的行。
o Empty string =資料分區是可見的(普通狀态)
運作兩個 select count語句來檢查連接配接語句涉及的兩個表中資料的可用性。 清單 43. Count Lineitem db2 “select count(*) from lineitem” |
圖 21. select count語句的結果 注意: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 ALLOW WRITE ACCESS IMMEDIATE CHECKED 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 語句的允許,新的資料才能變為可見。然而,當運作 SETINTEGRITY 時,可以對 LINEITEM 表中的現有資料進行完全通路,包括讀和寫操作。 使用者應該執行 SET INTEGRITY 事務進而能夠使用整個表。當運作SET INTEGRITY 時,不能夠對表執行 DDL 或其他實用類型的操作。 在這個練習中,在 NP_LINEITEM 表中建立并被連接配接到 LINEITEM 表的所有的行,都在連接配接語句指定的範圍内。如果這些行中存在超出此範圍的行,則需要在 SET INTEGRITY 語句中建立一個異常表來防止語句發生錯誤。是以推薦您始終在SET INTEGRITY 語句中包含一個異常表。如果沒有提供異常表的話,SET INTEGRITY 語句發現的錯誤将導緻語句失敗并且所有的工作都必須從頭做起。如果使用大量資料時,這可能是一個長期操作。有一點值得注意,如果 SET INTEGRITY 操作失敗,所有工作都需要重做,與之相比較,LOAD 僅僅抛棄存在問題的行。
對 LINEITEM表運作 select count SQL 以檢查連接配接的分區中資料的可用性: 清單 48. Count Lineitem db2 “select count(*) from lineitem” |
圖 24.select count語句的結果
注意:成功執行 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 操作中使用它來辨別被轉出的分區。同樣還需注意成功執行了 SETINTEGRITY 操作後,分區 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-DimensionalClustering(MDC)分離一個分區進而建立了一個新表時,這個表也将是一個 MDC。這個規則同樣适用于下面這個情況:從一個分布式表中分離分區進而在相同的分區組建立分布式表。執行 DETACH 操作後産生的表使用 MDC 索引定義而不是其他的索引。對于 MDC,在首次通路連接配接的表時将重新建構索引。在這種情況下,将自動對分離的分區進行索引清除操作。将從執行 DETACH 操作的使用者 ID 繼承索引的模式、權限和表空間。
運作兩個 select count語句檢查 DETACH 語句涉及的兩個表中的資料的可用性。 清單 52. Count Lineitem_jan1992 db2 “select count(*) from lineitem_jan1992” |
圖 26. select count語句的結果 注意:建立的 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表的分區
分區表的通路計劃
本實驗将研究如何在通路計劃中描述分區表:
1 您将更新分區表中的統計資訊。
2 您将使用db2expln指令并分析結果。
3 您将在執行檢視的操作中使用 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. 說明輸出
注意:該 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. 說明輸出
注意:這個 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特性。您已在以下幾個方面獲得了第一手的經驗:
· 如何定義分區表
· 如何将分區表放置在底層磁盤子系統
· 如何維護分區表
· 如何使用 DB2Explain說明分區表
範圍分區将資料映射到基于關鍵值範圍的分區,使用者為每一個分區建立關鍵值範圍。例如,企業通常希望以月份為機關,将銷售資料劃分到各月的分區中。與 MDC功能集合使用時,範圍分區将更加友善地定位資料,進而加快通過複雜查詢檢索資訊的速度。
IBM 教程:
http://www.ibm.com/developerworks/cn/education/data/dm0612read/index.html