DB2 9表分区
DB2 9表分區(qū)
開(kāi)始之前
CREATE TABLE 語(yǔ)句的 PARTITION BY 子句指定了表數(shù)據(jù)的分區(qū)。該定義中使用的列被稱(chēng)為表分區(qū)鍵列。
關(guān)于該特性的詳細(xì)說(shuō)明可參見(jiàn) “Table partitioning in DB2 9”(developerWorks,2006 年 5 月)。
表分區(qū)特性提供以下收益:
- 表數(shù)據(jù)可輕易實(shí)現(xiàn)轉(zhuǎn)入和轉(zhuǎn)出
- 對(duì)大型表的管理更加輕松
- 靈活的索引放置
- 更高的業(yè)務(wù)智能樣式查詢(xún)的性能
關(guān)于本教程
本教程中的練習(xí)將引領(lǐng)您使用表分區(qū)特性,并演示了表數(shù)據(jù)的轉(zhuǎn)入轉(zhuǎn)出、更輕松的大型表管理、靈活的索引放置和對(duì)業(yè)務(wù)智能樣式查詢(xún)的性能改善。
這些練習(xí)旨在演示上述各領(lǐng)域內(nèi)的一個(gè)或多個(gè)任務(wù)。
目標(biāo)
本教程的目標(biāo)是在以下方面探究 DB2 9 范圍分區(qū)的特性和優(yōu)點(diǎn):
-
創(chuàng)建范圍分區(qū)表
-
分區(qū)的轉(zhuǎn)入和轉(zhuǎn)出
-
分區(qū)表的管理
-
索引管理和放置
先決條件
本教程的目標(biāo)讀者是那些技能和經(jīng)驗(yàn)剛剛邁入中級(jí)水平的 DB2 專(zhuān)業(yè)人員。要學(xué)習(xí)本教程,您應(yīng)該熟悉 DB2 命令行、DB2 管理工具的使用,還應(yīng)具備 SQL 實(shí)踐經(jīng)驗(yàn)。
系統(tǒng)需求
要運(yùn)行本教程的示例,需要具備以下條件:
- DB2 9 Data Server
- Microsoft? Windows? 2000 或更高版本,以及一個(gè)具有管理員權(quán)限的帳戶(hù),或具有根訪問(wèn)權(quán)限的 Linux?(驗(yàn)證版)。
- 確保系統(tǒng)中的 Java Runtime Environment 是 1.4.2 或更高版本。
- 參考 DB2 9 系統(tǒng)需求頁(yè)面 確保您的硬件符合要求。
可通過(guò)上面的鏈接獲取 DB2 9 Express C。關(guān)于安裝 DB2 的步驟請(qǐng)參考 “DB2 XML 評(píng)估指南”(developerWorks,2006 年 6 月)。若未改動(dòng) DB2 的配置,安裝后 DB2 將自動(dòng)啟動(dòng)。
使用 partition.zip 文件提供的示例腳本和數(shù)據(jù)演示本教程的概念。將其內(nèi)容解壓縮到 scripts 子目錄(C:\scripts 或 home/userid/scripts)。本教程中將該目錄簡(jiǎn)稱(chēng)為 stmm_scripts。教程假設(shè)您使用的是 DB2 默認(rèn)安裝目錄,并且所有的 DB2 練習(xí)都通過(guò)一個(gè)數(shù)據(jù)庫(kù)管理員 ID 執(zhí)行。
創(chuàng)建分區(qū)表
這個(gè)實(shí)驗(yàn)將探討創(chuàng)建分區(qū)表、將數(shù)據(jù)載入分區(qū)表以及使用 describe 命令來(lái)說(shuō)明表范圍的方法:
登錄和基本指令
圖 1. 基本設(shè)置
登錄到您的機(jī)器,如圖 1 所示,使用 db2inst1。
打開(kāi)終端窗口(Linux)或 DB2 命令窗口(windows)。
切換到 scripts 子目錄。
清單 1. 切換目錄
cd c:\scripts
使用db2start 命令啟動(dòng) DB2,并連接到 SAMPLE 數(shù)據(jù)庫(kù)。
清單 2. StartDB2
db2start db2 connect to SAMPLE創(chuàng)建基本分區(qū)表
這一節(jié)將介紹分區(qū)表的基本創(chuàng)建和加載。您將創(chuàng)建不同格式的表、驗(yàn)證創(chuàng)建結(jié)果、加載數(shù)據(jù)并對(duì)表進(jìn)行查詢(xún)。
清單 3. 創(chuàng)建表
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')創(chuàng)建該表的 SQL 語(yǔ)句位于 EX1-6.sql 文件中,可使用如下命令運(yùn)行該文件:
清單 4. 運(yùn)行 EX1-6
db2 –vtf EX1-6.sql
使用下面的命令說(shuō)明為 LINEITEM 表創(chuàng)建的分區(qū)的范圍:
清單 5. 說(shuō)明
db2 describe data partitions for table LINEITEM
圖 2. 說(shuō)明為 LINEITEM 表創(chuàng)建的分區(qū)范圍
注意:創(chuàng)建了四個(gè)數(shù)據(jù)分區(qū)。其中的范圍包括邊界值。
將數(shù)據(jù)導(dǎo)入到 LINEITEM 表。該操作的導(dǎo)入命令位于 EX1-8.sql 文件中,可使用如下命令運(yùn)行:
清單 6. 帶有拒絕的加載
db2 –vtf EX1-8.sql
圖 3. 將數(shù)據(jù)導(dǎo)入到 LINEITEM 表
注意:導(dǎo)入時(shí)拒絕了 729 行數(shù)據(jù),這是因?yàn)樗鼈儾痪哂形挥诋?dāng)前 LINEITEM 表的數(shù)據(jù)分區(qū)定義范圍內(nèi)的 l_shipdate。
標(biāo)量函數(shù)可用于顯示行所屬的數(shù)據(jù)分區(qū)號(hào)(datapartitionnum)。執(zhí)行以下示例 SQL 查看標(biāo)量函數(shù)的輸出:
清單 7. 查詢(xún) - 匹配日期的分區(qū)
圖 4. 標(biāo)量函數(shù)的輸出
具有全部范圍的分區(qū)表
創(chuàng)建具有兩個(gè)額外數(shù)據(jù)分區(qū)的新 LINEITEM 表,其中一個(gè)分區(qū)用來(lái)捕獲低于當(dāng)前范圍的值,另一個(gè)分區(qū)用來(lái)捕獲高于當(dāng)前范圍的值。首先使用下面的命令刪除現(xiàn)有的 LINEITEM 分區(qū)表:
清單 8. 刪除表
db2 drop TABLE LINEITEM
然后使用如下 DDL 創(chuàng)建 LINEITEM 表的新版本:
清單 9. 創(chuàng)建表
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)創(chuàng)建該表的 SQL 位于 EX1-10.sql 文件中,可使用下列命令運(yùn)行:
清單 10. 運(yùn)行 EX1-10
db2 –vtf EX1-10.sql
使用下面的命令說(shuō)明為 LINEITEM 表創(chuàng)建的分區(qū)范圍。
清單 11. 說(shuō)明
db2 describe data partitions for table LINEITEM
圖 5. 說(shuō)明為 LINEITEM 表創(chuàng)建的分區(qū)范圍
注意:新的 MINVALUE 范圍具有一個(gè)最高值,該值和下一個(gè)數(shù)據(jù)分區(qū)開(kāi)始部分的值相等,但它并不包含該值。MAXVALUE 范圍具有一個(gè)最低值,該值和前一個(gè)范圍結(jié)束部分的值相等,但它不包含該值。這將創(chuàng)建一個(gè)無(wú)間隙的連續(xù)范圍。
將數(shù)據(jù)導(dǎo)入到 LINEITEM 表中。該操作的導(dǎo)入命令位于 EX1-8.sql 文件中,可使用下面的命令運(yùn)行該文件:
清單 12. 全面加載
db2 –vtf EX1-8.sql
圖 6. 將數(shù)據(jù)導(dǎo)入到 LINEITEM 表中
具有生成范圍的分區(qū)表
創(chuàng)建一個(gè)新 LINEITEM 表,它具有從 1992 年 1 月 1 日到 1998 年 12 月 31 日按月劃分的數(shù)據(jù)分區(qū)生成范圍。同樣,添加 minvalue 和 maxvalue 范圍來(lái)存放具有超過(guò)此范圍的 l_shipdate 的值的行。首先使用以下命令刪除現(xiàn)有的 LINEITEM 分區(qū)表:
清單 13. 刪除表
db2 drop TABLE LINEITEM
然后使用如下 DDL 創(chuàng)建 LINEITEM 表的新版本:
清單 14. 創(chuàng)建表
創(chuàng)建該表的 SQL 位于 EX1-13.sql 文件中,可使用下面的命令運(yùn)行該文件:
清單 15. 運(yùn)行 EX1-13
db2 –vtf EX1-13.sql
使用如下命令來(lái)說(shuō)明為 LINEITEM 表創(chuàng)建的分區(qū)范圍:
清單 16. 說(shuō)明
db2 describe data partitions for table LINEITEM
圖 7. 說(shuō)明為 LINEITEM 表創(chuàng)建的分區(qū)范圍
注意:創(chuàng)建了 86 個(gè)數(shù)據(jù)分區(qū),但是沒(méi)有包括這些范圍的最高值,因?yàn)檫@些最高值將和之后的數(shù)據(jù)分區(qū)的最低值重疊。
將數(shù)據(jù)導(dǎo)入到 LINEITEM 表。此操作的導(dǎo)入命令位于 EX1-8.sql 文件中,可使用下面的命令運(yùn)行該文件:
清單 17. 加載并生成
db2 –vtf EX1-8.sql
圖 8. 將數(shù)據(jù)導(dǎo)入到 LINEITEM 表
使用下面的 SQL 來(lái)驗(yàn)證 LINEITEM 表每一個(gè)數(shù)據(jù)分區(qū)的行數(shù):
清單 18. 查詢(xún)數(shù)據(jù)
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 語(yǔ)句驗(yàn)證 LINEITEM 表的每一個(gè)數(shù)據(jù)分區(qū)的行數(shù):
清單 19. 查詢(xún)數(shù)據(jù)腳本
db2 –vtf EX1-16.sql圖 9. 檢驗(yàn)行數(shù)
放置分區(qū)表
該實(shí)驗(yàn)探討放置分區(qū)表以及使用 describe 命令說(shuō)明表內(nèi)的范圍和放置情況的方法:
基本環(huán)境設(shè)置
使用
describe data partitions命令以及
show detail方法來(lái)顯示表空間的分區(qū)放置。
清單 20. 創(chuàng)建表
db2 describe data partitions for table LINEITEM show detail
圖 10. 表空間的分區(qū)放置
注意:TableSpID 列給出了包含分區(qū)的表空間的 ID 號(hào)。在本例中,TableSpID 是 ‘3’。
使用
list tablespaces命令標(biāo)識(shí)與 TableSpId 相關(guān)聯(lián)的表空間。
清單 21. 說(shuō)明
db2 list tablespaces
圖 11. 標(biāo)識(shí)表空間
注意:相應(yīng)值為 ‘2’ 的 TableSpID 是 USERSPACE1 或默認(rèn)的表空間。
現(xiàn)在將創(chuàng)建五個(gè)表空間來(lái)說(shuō)明不同的放置選項(xiàng)。使用如下命令:
清單 22. 說(shuō)明
創(chuàng)建該表空間的 SQL 位于 EX2-3.sql 文件中,可使用下面的命令運(yùn)行該文件:
清單 23. 查詢(xún)數(shù)據(jù)腳本
db2 –vtf EX2-3.sql
創(chuàng)建一個(gè)新的 LINEITEM 表,具有位于 dms_d1 和 dms_d2 表空間的生成分區(qū)集。首先,使用如下命令刪除現(xiàn)有的 LINEITEM 分區(qū)表:
清單 24. 刪除表
db2 drop TABLE LINEITEM
然后,使用下面的 DDL 創(chuàng)建 LINEITEM 表的新版本:
清單 25. 創(chuàng)建表
創(chuàng)建該表的 SQL 位于 EX2-4.sql 文件中,可使用下面的命令運(yùn)行該文件:
清單 26. 運(yùn)行 EX2-4
db2 –vtf EX2-4.sql
使用下面的命令說(shuō)明為 LINEITEM 表創(chuàng)建的分區(qū)范圍:
清單 27. 說(shuō)明
db2 describe data partitions for table LINEITEM show detail
圖 12. 說(shuō)明為 LINEITEM 表創(chuàng)建的分區(qū)范圍
圖 13. 分區(qū)
分區(qū)的顯式放置
創(chuàng)建一個(gè)具有四個(gè)數(shù)據(jù)分區(qū)的新 LINEITEM 表,每一個(gè)數(shù)據(jù)分區(qū)被顯式地放在表空間中。首先使用如下命令刪除現(xiàn)有的 LINEITEM 表:
清單 28. 刪除表
db2 drop TABLE LINEITEM
然后使用下面的 DDL 創(chuàng)建 LINEITEM 表的新版本:
清單 29. 創(chuàng)建表
創(chuàng)建表的 SQL 位于 EX2-6.sql 文件中,可使用下面的命令運(yùn)行該文件:
清單 30. 運(yùn)行 EX2-6
db2 –vtf EX2-6.sql
使用下面的命令說(shuō)明為 LINEITEM 表創(chuàng)建的分區(qū)范圍:
清單 31. 說(shuō)明
db2 describe data partitions for table LINEITEM show detail
圖 14. 說(shuō)明為 LINEITEM 表創(chuàng)建的分區(qū)范圍
注意:在本例中,每一個(gè)分區(qū)被放置在一個(gè)不同的 TableSpID 中,這個(gè) TableSpID 和創(chuàng)建表的 DDL 中指定的表空間是相對(duì)應(yīng)的。
創(chuàng)建一個(gè)具有四個(gè)數(shù)據(jù)分區(qū)的 LINEITEM 表,每一個(gè)數(shù)據(jù)分區(qū)被顯式地放在表空間并且索引被放在表空間 DMS_I1 中。 在這一步中,將引入命名分區(qū)的概念,而不是使用默認(rèn)的生成名稱(chēng)。 首先,使用下面的命令刪除現(xiàn)有的 LINEITEM 分區(qū)表:
清單 32. 刪除表
db2 drop TABLE LINEITEM
然后,使用以下的 DDL 創(chuàng)建 LINEITEM 表的新版本:
清單 33. 創(chuàng)建表
創(chuàng)建表的 SQL 位于 EX2-8.sql 文件中,可使用下面的命令運(yùn)行該文件:
清單 34. 運(yùn)行 EX2-8
db2 –vtf EX2-8.sql
在 LINEITEM 表中創(chuàng)建一個(gè)索引,并將它放置在表空間 DMS_I1 中。使用如下 SQL:
清單 35. 索引
db2 “create index I_LINEITEM on LINEITEM(L_SHIPDATE) in DMS_I1”
使用下面的 SQL 檢驗(yàn)和該表相關(guān)聯(lián)的索引的位置:
清單 36. 說(shuō)明
db2 “select tabname, index_tbspace from syscat.tables where tabname = ‘LINEITEM’”
圖 15. 檢驗(yàn)索引的位置
注意:索引空間是 DMS_I1。如果沒(méi)有為分區(qū)表指定表空間,那么默認(rèn)情況下索引位于連接著的第一個(gè)表空間。 在 CREATE TABLE 中定義表空間是很好的實(shí)踐。然而,無(wú)論您是否在創(chuàng)建表語(yǔ)句 ID 中指定索引表空間,這并不限制您將來(lái)放置索引的位置。您可以在 CREATE INDEX 語(yǔ)句本身顯式地指定索引表空間。 同一分區(qū)表的不同索引可以放置在不同的表空間。
管理分區(qū)表
這個(gè)實(shí)驗(yàn)將查看如何管理和操作分區(qū)表:
使用現(xiàn)有的表添加一個(gè)新的分區(qū)
將數(shù)據(jù)導(dǎo)入 LINEITEM 表。創(chuàng)建表空間的 SQL 位于 EX3-1.sql 文件中,可使用下面的命令運(yùn)行該文件:
清單 37. 導(dǎo)入數(shù)據(jù)
db2 –vtf EX3-1.sql
圖 16. 將數(shù)據(jù)導(dǎo)入到 LINEITEM 表
注意:分區(qū)表中的記錄數(shù),以及將進(jìn)行連接和分離的記錄數(shù)對(duì)于說(shuō)明數(shù)據(jù)庫(kù)中的數(shù)據(jù)何時(shí)可用非常重要。
創(chuàng)建一個(gè)名為 NP_LINEITEM 的新表。腳本 EX3-2.sql 創(chuàng)建一個(gè)具有 87 行的新表 NP_LINEITEM:
清單 38. 新分區(qū)
db2 –vtf EX3-2.sql
圖 17. 將數(shù)據(jù)導(dǎo)入到 NP_LINEITEM 表
使用下面的命令說(shuō)明為 LINEITEM 表創(chuàng)建的分區(qū)范圍:
清單 39. 說(shuō)明
db2 describe data partitions for table LINEITEM show detail圖 18. LINEITEM 表的分區(qū)
注意:LINEITEM 表目前包含 4 個(gè)數(shù)據(jù)分區(qū)。
使用Alter語(yǔ)句將一個(gè)新的分區(qū)連接(轉(zhuǎn)入)到現(xiàn)有的 LINEITEM 表。
清單 40. 新分區(qū)
可以使用以下命令運(yùn)行腳本 EX3-4:
清單 41. 新分區(qū)
db2 –vtf EX3-4.sql圖 19. 腳本 EX3-4
注意:LINEITEM 表被置于 SET INTEGRITY PENDING 狀態(tài)。
連接后,使用
describe data partitions命令來(lái)說(shuō)明為 LINEITEM 表創(chuàng)建的分區(qū)范圍:
清單 42. 說(shuō)明
db2 describe data partitions for table LINEITEM show detail
圖 20. LINEITEM 表的分區(qū)
注意
:新數(shù)據(jù)分區(qū)(JAN1994)PartitionId 4 現(xiàn)在連接到了 LINEITEM 表。然而連接的分區(qū)的 AccessMode 值為 ‘N’ 并且 Status 的值為 ‘A’。 AccessMode 可能的值有:
- D = 沒(méi)有數(shù)據(jù)移動(dòng)
- F = 完全訪問(wèn)
- N = 不訪問(wèn)
- R = 只讀訪問(wèn)
Status 可能的值有:
- A = 數(shù)據(jù)分區(qū)是新連接的
- D = 數(shù)據(jù)分區(qū)是分離的
- I = 只有在執(zhí)行異步索引清除時(shí)才對(duì)條目位于目錄的分離的數(shù)據(jù)分區(qū)進(jìn)行維護(hù);當(dāng)所有引用分離數(shù)據(jù)分區(qū)的索引記錄刪除后,將刪除 STATUS 值為 ‘I’ 的行。
- Empty string = 數(shù)據(jù)分區(qū)是可見(jiàn)的(普通狀態(tài))
運(yùn)行兩個(gè)select count語(yǔ)句來(lái)檢查連接語(yǔ)句涉及的兩個(gè)表中數(shù)據(jù)的可用性。
清單 43. Count Lineitem
db2 “select count(*) from lineitem”
圖 21. select count 語(yǔ)句的結(jié)果
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-fHcMiLd2-1576419249173)(https://www.ibm.com/developerworks/cn/education/data/dm0612read/s25a.jpg)]
注意:LINEITEM 表最初的分區(qū)是可用的,但是 PartitionId 4 中的新數(shù)據(jù)仍不可見(jiàn)。
清單 44. Count np-lineitem
db2 “select count(*) from np_lineitem”圖 22. select count 語(yǔ)句的結(jié)果
注意:NP_LINEITEM 表現(xiàn)在是一個(gè)未定義的對(duì)象,在 LINEITEM 表內(nèi)只能將其作為一個(gè)分區(qū)使用。
創(chuàng)建一個(gè)異常表并與 SET INTEGRITY 語(yǔ)句結(jié)合使用。執(zhí)行該操作的 DDL 位于 EX3-7.sql 文件,可使用下面的命令運(yùn)行該文件:
清單 45. 異常表
db2 –vtf EX3-7.sql
對(duì) LINEITEM 分區(qū)表運(yùn)行set integrity語(yǔ)句 。
清單 46. 設(shè)置完整性
執(zhí)行該操作的 SQL 位于 EX3-8.sql 文件中,可以使用下面的命令運(yùn)行該文件:
清單 47. 設(shè)置完整性
db2 –vtf EX3-8.sql圖 23. EX3-8.sql 文件
注意:SET INTEGRITY 對(duì)于檢查新連接的數(shù)據(jù)是否在范圍內(nèi)是必需的,它還執(zhí)行對(duì)索引和其他獨(dú)立對(duì)象(例如物化查詢(xún)表)所有必需的維護(hù)工作。只有得到 SET INTEGRITY 語(yǔ)句的允許,新的數(shù)據(jù)才能變?yōu)榭梢?jiàn)。然而,當(dāng)運(yùn)行 SET INTEGRITY 時(shí),可以對(duì) LINEITEM 表中的現(xiàn)有數(shù)據(jù)進(jìn)行完全訪問(wèn),包括讀和寫(xiě)操作。 用戶(hù)應(yīng)該執(zhí)行 SET INTEGRITY 事務(wù)從而能夠使用整個(gè)表。當(dāng)運(yùn)行 SET INTEGRITY 時(shí),不能夠?qū)Ρ韴?zhí)行 DDL 或其他實(shí)用類(lèi)型的操作。 在這個(gè)練習(xí)中,在 NP_LINEITEM 表中創(chuàng)建并被連接到 LINEITEM 表的所有的行,都在連接語(yǔ)句指定的范圍內(nèi)。如果這些行中存在超出此范圍的行,則需要在 SET INTEGRITY 語(yǔ)句中創(chuàng)建一個(gè)異常表來(lái)防止語(yǔ)句發(fā)生錯(cuò)誤。所以推薦您始終在 SET INTEGRITY 語(yǔ)句中包含一個(gè)異常表。如果沒(méi)有提供異常表的話,SET INTEGRITY 語(yǔ)句發(fā)現(xiàn)的錯(cuò)誤將導(dǎo)致語(yǔ)句失敗并且所有的工作都必須從頭做起。如果使用大量數(shù)據(jù)時(shí),這可能是一個(gè)長(zhǎng)期操作。有一點(diǎn)值得注意,如果 SET INTEGRITY 操作失敗,所有工作都需要重做,與之相比較,LOAD 僅僅拋棄存在問(wèn)題的行。
對(duì) LINEITEM 表運(yùn)行select countSQL 以檢查連接的分區(qū)中數(shù)據(jù)的可用性:
清單 48. Count Lineitem
db2 “select count(*) from lineitem”
圖 24. select count 語(yǔ)句的結(jié)果
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-ReUztOvx-1576419249176)(https://www.ibm.com/developerworks/cn/education/data/dm0612read/s26b.jpg)]
從分區(qū)表中分離一個(gè)分區(qū)
使用describe data partitions show detail
命令來(lái)標(biāo)識(shí)一個(gè)分區(qū)的 PartitionName,您將把這個(gè)分區(qū)從 LINEITEM 分區(qū)表中分離(轉(zhuǎn)出)出來(lái)。
清單 49. 說(shuō)明表
db2 describe data partitions for table LINEITEM show detail
圖 25. LINEITEM 表的分區(qū)
注意:將分離最早的分區(qū)范圍 PartitionId 0。該分區(qū)的 PartitionName 是 JAN1992。將在 DETACH 操作中使用它來(lái)標(biāo)識(shí)被轉(zhuǎn)出的分區(qū)。同樣還需注意成功執(zhí)行了 SET INTEGRITY 操作后,分區(qū) JAN1994 的 AccessMode 的值為 ‘F’,Status 值為空。TableSpId、PartObjId 和 LongTblSpId 的結(jié)果可能和這里顯示的不一樣。
使用
Alter語(yǔ)句將 JAN1992 從 LINEITEM 表中分離(轉(zhuǎn)出)。
清單 50. Alter 表
ALTER TABLE LINEITEM DETACH PARTITION JAN1992 INTO LINEITEM_JAN1992
創(chuàng)建文件的 SQL 位于 EX3-11.sql 文件中,可使用下面的命令運(yùn)行該文件:
清單 51. Alter 表
db2 –vtf EX3-11.sql.
注意:將 JAN1992 成功分離后,將創(chuàng)建一個(gè)新的表 LINEITEM_JAN1992。在DETACH操作中沒(méi)有涉及數(shù)據(jù)移動(dòng),并且位于相同表空間的新表的行為和它作為 LINEITEM 分區(qū)表的一部分時(shí)是一樣的。此時(shí)不需要對(duì) LINEITEM 表運(yùn)行SET INTEGRITY語(yǔ)句,因?yàn)闆](méi)有對(duì) LINEITEM 表定義的 MQTs。 還有一點(diǎn)值得注意,如果從 Multi-Dimensional Clustering(MDC)分離一個(gè)分區(qū)從而創(chuàng)建了一個(gè)新表時(shí),這個(gè)表也將是一個(gè) MDC。這個(gè)規(guī)則同樣適用于下面這個(gè)情況:從一個(gè)分布式表中分離分區(qū)從而在相同的分區(qū)組創(chuàng)建分布式表。執(zhí)行DETACH操作后產(chǎn)生的表使用 MDC 索引定義而不是其他的索引。對(duì)于 MDC,在首次訪問(wèn)連接的表時(shí)將重新構(gòu)建索引。在這種情況下,將自動(dòng)對(duì)分離的分區(qū)進(jìn)行索引清除操作。將從執(zhí)行DETACH操作的用戶(hù) ID 繼承索引的模式、權(quán)限和表空間。
運(yùn)行兩個(gè)select count語(yǔ)句檢查DETACH語(yǔ)句涉及的兩個(gè)表中的數(shù)據(jù)的可用性。
清單 52. Count Lineitem_jan1992
db2 “select count(*) from lineitem_jan1992”
圖 26. select count 語(yǔ)句的結(jié)果
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-EgIPyQFS-1576419249177)(https://www.ibm.com/developerworks/cn/education/data/dm0612read/s28a.jpg)]
注意:創(chuàng)建的 LINEITEM_JAN1992 表包含 38 行,它被包含在 LINEITEM 分區(qū)表的 JAN1992 分區(qū)中。
清單 53. Count lineitem
db2 “select count(*) from lineitem”圖 27. select count 語(yǔ)句的結(jié)果
注意:此時(shí) LINEITEM 表完全可用,并且不包括 PART0 中的數(shù)據(jù)。
當(dāng)數(shù)據(jù)被移動(dòng)到分區(qū)表中,或當(dāng)希望將數(shù)據(jù)加載到或直接插入分區(qū)表中時(shí),一個(gè)更合適的方法是向現(xiàn)有的分區(qū)表添加一個(gè)空的分區(qū)。使用下面的命令向現(xiàn)有的 LINEITEM 表添加一個(gè)空的分區(qū):
清單 54. 說(shuō)明
圖 28. 向現(xiàn)有的 LINEITEM 表添加一個(gè)空的分區(qū)
使用 describe data partitions show detail 命令來(lái)檢驗(yàn) PartitionName 為 JULY1994 的分區(qū)是否被添加到 LINEITEM 中:
清單 55. 說(shuō)明
db2 describe data partitions for table LINEITEM show detail圖 29. LINEITEM 表的分區(qū)
分區(qū)表的訪問(wèn)計(jì)劃
本實(shí)驗(yàn)將研究如何在訪問(wèn)計(jì)劃中描述分區(qū)表:
您將更新分區(qū)表中的統(tǒng)計(jì)信息。
您將使用 db2expln 命令并分析結(jié)果。
您將在執(zhí)行查看的操作中使用 DB2 命令和 SQL 。
對(duì) LINEITEM 表執(zhí)行RUNSTATS操作:
清單 56. Runstats
db2 runstats on table db2inst1.lineitem
說(shuō)明以下 SQL 語(yǔ)句并檢查說(shuō)明輸出:
清單 57. 說(shuō)明
db2 “select l_shipdate,sum(l_quantity) from LINEITEM group by l_shipdate”
要進(jìn)行說(shuō)明的 SQL 位于 EX4-2.sql 文件,可以使用下面的命令運(yùn)行該文件:
清單 58. 說(shuō)明輸出
db2expln –d SAMPLE –t –f EX4-2.sql
圖 30. 說(shuō)明輸出
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-0PqTV96B-1576419249179)(https://www.ibm.com/developerworks/cn/education/data/dm0612read/s30.jpg)]
注意:該 SQL 執(zhí)行了 LINEITEM 表的索引掃描。說(shuō)明輸出中有一個(gè)關(guān)于表分區(qū)的要點(diǎn)需要注意,所訪問(wèn)的表是被分區(qū)的,并且在掃描過(guò)程中所有數(shù)據(jù)分區(qū)都將被訪問(wèn)。
說(shuō)明下面的 SQL 語(yǔ)句并檢查說(shuō)明輸出:
清單 59. 說(shuō)明
要進(jìn)行說(shuō)明的 SQL 語(yǔ)句位于 EX4-3.sql 文件中,可使用下面的命令運(yùn)行該文件:
清單 60. 說(shuō)明輸出
db2expln –d SAMPLE –t –f EX4-3.sql圖 31. 說(shuō)明輸出
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-8wvYnGp1-1576419249180)(https://www.ibm.com/developerworks/cn/education/data/dm0612read/s31.jpg)]
注意:這個(gè) SQL 語(yǔ)句執(zhí)行了 LINEITEM 表的索引掃描。在本例中,可以看到優(yōu)化器能夠執(zhí)行數(shù)據(jù)分區(qū)排除操作。在說(shuō)明輸出中要注意的是關(guān)于表分區(qū),訪問(wèn)的表是被分區(qū)的,將執(zhí)行分區(qū)排除功能以及刪除活動(dòng)數(shù)據(jù)分區(qū)的值。 在本例中,活動(dòng)的數(shù)據(jù)分區(qū)為 1-2。這里引用的是 syscat.datapartitions 中的序列號(hào)(seqno)而不是 describe data partitions 命令中的 PartitionId。
使用下面的 SQL 確定在前面說(shuō)明示例中活動(dòng)的分區(qū)的名稱(chēng):
清單 61. 說(shuō)明
圖 32. 分區(qū)名稱(chēng)
結(jié)束語(yǔ)
本教程基于 IBM DB2 9 Data Partitioning 特性。您已在以下幾個(gè)方面獲得了第一手的經(jīng)驗(yàn):
- 如何定義分區(qū)表
- 如何將分區(qū)表放置在底層磁盤(pán)子系統(tǒng)
- 如何維護(hù)分區(qū)表
- 如何使用 DB2 Explain 說(shuō)明分區(qū)表
范圍分區(qū)將數(shù)據(jù)映射到基于關(guān)鍵值范圍的分區(qū),用戶(hù)為每一個(gè)分區(qū)建立關(guān)鍵值范圍。例如,企業(yè)通常希望以月份為單位,將銷(xiāo)售數(shù)據(jù)劃分到各月的分區(qū)中。與 MDC 功能集合使用時(shí),范圍分區(qū)將更加方便地定位數(shù)據(jù),從而加快通過(guò)復(fù)雜查詢(xún)檢索信息的速度。
下載資源
本文的示例腳本和數(shù)據(jù) (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
總結(jié)
- 上一篇: SRE_Google运维解密_笔记
- 下一篇: 对SRE的理解