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 命令來說明表范圍的方法:
登錄和基本指令
圖 1. 基本設置
登錄到您的機器,如圖 1 所示,使用 db2inst1。
打開終端窗口(Linux)或 DB2 命令窗口(windows)。
切換到 scripts 子目錄。
清單 1. 切換目錄
cd c:\scripts
使用db2start 命令啟動 DB2,并連接到 SAMPLE 數據庫。
清單 2. StartDB2
db2start db2 connect to SAMPLE創建基本分區表
這一節將介紹分區表的基本創建和加載。您將創建不同格式的表、驗證創建結果、加載數據并對表進行查詢。
清單 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. 查詢 - 匹配日期的分區
圖 4. 標量函數的輸出
具有全部范圍的分區表
創建具有兩個額外數據分區的新 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. 創建表
創建該表的 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. 檢驗行數
放置分區表
該實驗探討放置分區表以及使用 describe 命令說明表內的范圍和放置情況的方法:
基本環境設置
使用
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. 說明
創建該表空間的 SQL 位于 EX2-3.sql 文件中,可使用下面的命令運行該文件:
清單 23. 查詢數據腳本
db2 –vtf EX2-3.sql
創建一個新的 LINEITEM 表,具有位于 dms_d1 和 dms_d2 表空間的生成分區集。首先,使用如下命令刪除現有的 LINEITEM 分區表:
清單 24. 刪除表
db2 drop TABLE LINEITEM
然后,使用下面的 DDL 創建 LINEITEM 表的新版本:
清單 25. 創建表
創建該表的 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. 分區
分區的顯式放置
創建一個具有四個數據分區的新 LINEITEM 表,每一個數據分區被顯式地放在表空間中。首先使用如下命令刪除現有的 LINEITEM 表:
清單 28. 刪除表
db2 drop TABLE LINEITEM
然后使用下面的 DDL 創建 LINEITEM 表的新版本:
清單 29. 創建表
創建表的 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. 創建表
創建表的 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 語句本身顯式地指定索引表空間。 同一分區表的不同索引可以放置在不同的表空間。
管理分區表
這個實驗將查看如何管理和操作分區表:
使用現有的表添加一個新的分區
將數據導入 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. 新分區
可以使用以下命令運行腳本 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. 設置完整性
執行該操作的 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)]
從分區表中分離一個分區
使用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. 說明
圖 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. 說明
要進行說明的 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. 說明
圖 32. 分區名稱
結束語
本教程基于 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
總結
- 上一篇: SRE_Google运维解密_笔记
- 下一篇: 对SRE的理解