文章詳情頁(yè)
提高商業(yè)智能環(huán)境中DB2查詢(xún)的性能(1)
瀏覽:133日期:2023-11-08 10:19:40
高效地運(yùn)行大型查詢(xún),是商業(yè)智能環(huán)境中的頂級(jí)性能挑戰(zhàn)。學(xué)習(xí)在這種環(huán)境中提高 IBM® DB2® 數(shù)據(jù)服務(wù)器查詢(xún)性能的技巧。逐步了解各種不同的方法,然后在自己的系統(tǒng)上進(jìn)行試驗(yàn)。將每種方法應(yīng)用于一條 SQL 語(yǔ)句,并使用 db2batch 工具評(píng)測(cè)性能。簡(jiǎn)介本文主要討論可以使決策支持系統(tǒng)(DSS)中的大型查詢(xún)高效地執(zhí)行的一些方法。這些查詢(xún)通常都是訪問(wèn)較多數(shù)據(jù)的單純 select 查詢(xún)。下面是我們要討論的一些方法:1、建立適當(dāng)?shù)膮⒄胀暾约s束2、使用物化查詢(xún)表(MQT)將表復(fù)制到其它數(shù)據(jù)庫(kù)分區(qū),以答應(yīng)非分區(qū)鍵列上的合并連接3、使用多維集群(MDC)4、使用表分區(qū)(DB2® 9 的新功能)5、結(jié)合使用表分區(qū)和多維集群6、使用 MQT 預(yù)先計(jì)算聚合結(jié)果本文中的例子針對(duì) Windows 平臺(tái)上運(yùn)行的 DB2 9。但是,其中的概念和信息對(duì)于任何平臺(tái)都是有用的。由于大多數(shù)商業(yè)智能(BI)環(huán)境都使用 DB2 Database Partitioning Feature(DPF,DB2 數(shù)據(jù)庫(kù)分區(qū)特性),我們的例子也使用 DPF 將數(shù)據(jù)劃分到多個(gè)物理和邏輯分區(qū)之中。數(shù)據(jù)庫(kù)布局和設(shè)置本節(jié)描述用于在我們的系統(tǒng)上執(zhí)行測(cè)試的數(shù)據(jù)庫(kù)的物理和邏輯布局。星型模式布局本文使用如下所示的星型模式:清單 1. 星型模式 PRODUCT_DIM DATE_DIM/ / SALES_FACT | | STORE_DIM其中的表的定義如下:表名 類(lèi)型 列名 數(shù)據(jù)類(lèi)型 列描述 SALES_FACTFACT TABLEDATE_IDDATE產(chǎn)品售出日期PRODUCT_IDINT所購(gòu)買(mǎi)產(chǎn)品的標(biāo)識(shí)符STORE_IDINT出售產(chǎn)品的商店的標(biāo)識(shí)符QUANTITYINT這次交易中售出產(chǎn)品的數(shù)量PRICEINT產(chǎn)品購(gòu)買(mǎi)價(jià)格。[為了簡(jiǎn)單起見(jiàn),該字段為整型,但是使用小數(shù)型更符合實(shí)際]TRANSACTION_DETAILSCHAR(100)關(guān)于此次交易的描述/具體信息DATE_DIMDIMENSION TABLEDATE_ID NOT NULLDATE惟一標(biāo)識(shí)符MONTHINT日期記錄所屬的月份QUARTERINT日期記錄所屬的季度(第 1、第 2、第 3 或第 4 季度)YEARINT日期記錄所屬的年份PRODUCT_DIMDIMENSION TABLEPRODUCT_ID NOT NULLINT產(chǎn)品惟一標(biāo)識(shí)符PRODUCT_DESCCHAR(20)對(duì)產(chǎn)品的描述MODELCHAR(200)產(chǎn)品型號(hào)MAKECHAR(50)產(chǎn)品的質(zhì)地STORE_DIMDIMENSION TABLESTORE_ID NOT NULLINT商店惟一標(biāo)識(shí)符LOCATIONCHAR(15)商店位置DISTRICTCHAR(15)商店所屬街區(qū)REGIONCHAR(15)商店所屬區(qū)域事實(shí)表 SALES_FACT 包含 2006 年的總體銷(xiāo)售信息。它包括產(chǎn)品售出日期、產(chǎn)品 ID、銷(xiāo)售該產(chǎn)品的商店的 ID、售出的特定產(chǎn)品的數(shù)量,以及產(chǎn)品的價(jià)格。事實(shí)表中還添加了 TRANSACTION_DETAILS 列,以便在從事實(shí)表中訪問(wèn)數(shù)據(jù)時(shí)生成更多的 I/O。維度表 DATE_DIM 包含商店開(kāi)放期間的惟一的日期和相應(yīng)的月份、季度和年份信息。維度表 PRODUCT_DIM 包含公司所銷(xiāo)售的不同產(chǎn)品。每種產(chǎn)品有一個(gè)惟一的產(chǎn)品 ID 和一個(gè)產(chǎn)品描述、型號(hào)以及質(zhì)地。維度表 STORE_DIM 包含不同的商店 ID 和商店的位置、所屬街區(qū)以及所屬區(qū)域等信息。數(shù)據(jù)庫(kù)分區(qū)信息數(shù)據(jù)庫(kù)分區(qū)組名 數(shù)據(jù)庫(kù)分區(qū)數(shù) FACT_GROUP0,1,2,3DATE_GROUP1PRODUCT_GROUP2STORE_GROUP3各表都位于它自己的分區(qū)組中。3 個(gè)維度表都比較小,所以它們位于一個(gè)數(shù)據(jù)庫(kù)分區(qū)上。而事實(shí)表則跨 4 個(gè)分區(qū)。表空間信息表空間名 數(shù)據(jù)庫(kù)分區(qū)組 表 FACT_SMSFACT_GROUPSALES_FACTDATE_SMSDATE_GROUPDATE_DIMPRODUCT_SMSPRODUCT_GROUPPRODUCT_DIMSTORE_SMSSTORE_GROUPSTORE_DIM各表都位于自己的表空間中。還有一種常見(jiàn)的方法是將這 3 個(gè)維度表放在同一個(gè)表空間中。緩沖池信息本文中的測(cè)試所使用的默認(rèn)緩沖池是 IBMDEFAULTBP,該緩沖池由 1,000 個(gè) 4K 的頁(yè)面組成。在本文的測(cè)試中,所有表空間共享這個(gè)緩沖池。在通常的 BI 環(huán)境中,會(huì)創(chuàng)建不同的緩沖池。主查詢(xún)下面的查詢(xún)用于測(cè)試本文中討論的各種不同的方法。該查詢(xún)執(zhí)行一個(gè)向外連接,比較二月份和十一月份 10 家商店的銷(xiāo)售信息。清單 2. 主查詢(xún) [Query1.sql]WITH TMP1 (MONTH_1,STORE,REGION,DISTRICT,AMOUNT_1) AS( SELECT D.MONTH AS MONTH, S.STORE_ID AS STORE_ID, S.DISTRICT AS DISTRICT, S.REGION AS REGION, SUM(F1.QUANTITY * F1.PRICE) AS AMOUNT FROM SKAPOOR.SALES_FACT F1, SKAPOOR.DATE_DIM D, SKAPOOR.PRODUCT_DIM P, SKAPOOR.STORE_DIM S WHERE P.MODEL LIKE '%model%' AND F1.DATE_ID=D.DATE_ID AND F1.PRODUCT_ID=P.PRODUCT_ID AND F1.STORE_ID=S.STORE_ID AND F1.DATE_ID BETWEEN '2006-01-01' AND '2006-01-31' AND F1.STORE_ID IN (29, 30, 42, 55, 67, 72, 82, 99, 123, 199) AND D.MONTH = 1 GROUP BY S.STORE_ID,S.DISTRICT,S.REGION,D.MONTH) ,TMP2 (MONTH_11,STORE,REGION,DISTRICT,AMOUNT_11) AS( SELECT D1.MONTH AS MONTH, S1.STORE_ID AS STORE_ID, S1.DISTRICT AS DISTRICT, S1.REGION AS REGION, SUM(F2.QUANTITY * F2.PRICE) AS AMOUNT FROM SKAPOOR.SALES_FACT F2, SKAPOOR.DATE_DIM D1, SKAPOOR.PRODUCT_DIM P1, SKAPOOR.STORE_DIM S1 WHERE P1.MODEL LIKE '%model%' AND F2.DATE_ID=D1.DATE_ID AND F2.PRODUCT_ID=P1.PRODUCT_ID AND F2.STORE_ID=S1.STORE_ID AND F2.DATE_ID BETWEEN '2006-11-01' AND '2006-11-30' AND F2.STORE_ID IN (29, 30, 42, 55, 67, 72, 82, 99, 123, 199) AND D1.MONTH=11 GROUP BY S1.STORE_ID,S1.DISTRICT,S1.REGION,D1.MONTH)SELECT A.*, B.*FROM TMP1 A LEFT OUTER JOIN TMP2 B ON (A.STORE=B.STORE AND A.REGION=B.REGION AND A.DISTRICT=B.DISTRICT)ORDER BY A.AMOUNT_1 DESC, B.AMOUNT_11 DESC;環(huán)境設(shè)置本文的測(cè)試是使用以下環(huán)境執(zhí)行的:清單 3. db2levelDB2 9 Enterprise Edition:DB21085I Instance "DB2" uses "32" bits and DB2 code release "SQL09010" withlevel identifier "02010107".Informational tokens are "DB2 9.1.0.356", "s060629", "NT32", and Fix Pack "0".Product is installed at "C:PROGRA~1IBMSQLLIB" with DB2 Copy Name "DB2COPY1".清單 4. 操作系統(tǒng)System: WIN32_NT SKAPOOR Service Pack 2 5.1 x86 Family 15, model 4, stepping 3清單 5. 硬件CPU: total:2 online:2 Cores per socket:1 Threading degree per core:2Physical Memory(MB): total:2551 free:1988 available:1949Virtual Memory(MB): total:4950 free:6575Swap Memory(MB): total:2399 free:45871 Physical disk Size 100GB空間需求為了重新創(chuàng)建本文中描述的所有測(cè)試用例,需要高達(dá) 20Gb 的磁盤(pán)空間來(lái)存放數(shù)據(jù)和日志文件。其中將近 13Gb 的空間要分配給日志文件。我們要使用循環(huán)日志記錄,分配 100 個(gè)主日志:清單 6. 用于日志的數(shù)據(jù)庫(kù)配置Log file size (4KB) (LOGFILSIZ) = 8192Number of primary log files(LOGPRIMARY) = 100Number of secondary log files (LOGSECOND) = 150略加修改為事實(shí)表填充數(shù)據(jù)的腳本,即可減少日志文件所需的磁盤(pán)空間。本文的后面將對(duì)此進(jìn)行討論。設(shè)置數(shù)據(jù)庫(kù)第一步是創(chuàng)建一個(gè)測(cè)試數(shù)據(jù)庫(kù)。在本文的測(cè)試中,創(chuàng)建了 4 個(gè)邏輯數(shù)據(jù)分區(qū)。在 etcservices 文件中,應(yīng)確保有足夠的端口用于創(chuàng)建 4 個(gè)數(shù)據(jù)分區(qū)。在我們的測(cè)試環(huán)境中,文件 C:WINDOWSsystem32driversetcservices 中包含關(guān)于實(shí)例 "DB2" 的以下內(nèi)容:清單 7. services 文件的內(nèi)容DB2_DB2 60000/tcpDB2_DB2_1 60001/tcpDB2_DB2_2 60002/tcpDB2_DB2_END 60003/tcpDB2c_DB2 50000/tcp為向?qū)嵗砑訑?shù)據(jù)庫(kù)分區(qū),可使用 DB2 CLP 執(zhí)行以下命令:清單 8. 使用 db2ncrt 命令創(chuàng)建數(shù)據(jù)庫(kù)分區(qū)db2stopdb2ncrt /n:1 /u:username,password /i:DB2 /m:machine /p:1db2ncrt /n:2 /u:username,password /i:DB2 /m:machine /p:2db2ncrt /n:3 /u:username,password /i:DB2 /m:machine /p:3其中 /u 選項(xiàng)所表示的用戶(hù)名和密碼,/m 選項(xiàng)所表示的計(jì)算機(jī)名,以及 /i 選項(xiàng)所表示的實(shí)例名應(yīng)該根據(jù)您自己的環(huán)境加以修改。創(chuàng)建數(shù)據(jù)庫(kù)創(chuàng)建數(shù)據(jù)庫(kù) DSS_DB。這里使用 D: 盤(pán)存儲(chǔ)該數(shù)據(jù)庫(kù)。請(qǐng)根據(jù)您自己的環(huán)境進(jìn)行調(diào)整。清單 9. 創(chuàng)建數(shù)據(jù)庫(kù)的命令db2 create database dss_db on D:;數(shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)治理器是使用下面的設(shè)置來(lái)配置的。db2_all 工具用于設(shè)置所有數(shù)據(jù)庫(kù)分區(qū)上的數(shù)據(jù)庫(kù)配置和數(shù)據(jù)庫(kù)治理器配置。清單 10. 更新數(shù)據(jù)庫(kù)治理器配置的語(yǔ)句db2_all update dbm cfg using cpuspeed 2.282997e-007 intra_parallel NO comm_bandwidth 100.000000db2_all update db cfg for DSS_DB using locklist 2450 dft_degree 1 maxlocks 60 avg_appls 1 stmtheap 16384 dft_queryopt 5創(chuàng)建數(shù)據(jù)庫(kù)分區(qū)組和表空間使用以下語(yǔ)句創(chuàng)建數(shù)據(jù)庫(kù)分區(qū)組和表空間??梢詫⑦@些語(yǔ)句復(fù)制到一個(gè)名為 STORAGE.ddl 的文件中,然后使用下面的命令執(zhí)行它們:db2 -tvf STORAGE.ddl -z storage.log清單 11. 創(chuàng)建數(shù)據(jù)庫(kù)分區(qū)組和表空間的語(yǔ)句CONNECT TO DSS_DB;---------------------------------------------------- DDL Statements for DATABASE PARTITION GROUPS ----------------------------------------------------CREATE DATABASE PARTITION GROUP "FACT_GROUP" ON DBPARTITIONNUMS(0,1,2,3);CREATE DATABASE PARTITION GROUP "DATE_GROUP" ON DBPARTITIONNUMS(1);CREATE DATABASE PARTITION GROUP "PRODUCT_GROUP" ON DBPARTITIONNUMS(2);CREATE DATABASE PARTITION GROUP "STORE_GROUP" ON DBPARTITIONNUMS(3);COMMIT WORK;-------------------------------------- DDL Statements for TABLESPACES --------------------------------------CREATE REGULAR TABLESPACE FACT_SMS IN DATABASE PARTITION GROUP FACT_GROUPPAGESIZE 4096 MANAGED BY SYSTEMUSING ('d:databasefact_tbsp0') ON DBPARTITIONNUMS (0)USING ('d:databasefact_tbsp1') ON DBPARTITIONNUMS (1)USING ('d:databasefact_tbsp2') ON DBPARTITIONNUMS (2)USING ('d:databasefact_tbsp3') ON DBPARTITIONNUMS (3)EXTENTSIZE 32PREFETCHSIZE AUTOMATICBUFFERPOOL IBMDEFAULTBPOVERHEAD 7.500000TRANSFERRATE 0.060000NO FILE SYSTEM CACHING DROPPED TABLE RECOVERY ON;CREATE REGULAR TABLESPACE DATE_SMS IN DATABASE PARTITION GROUPDATE_GROUP PAGESIZE 4096 MANAGED BY SYSTEMUSING ('d:databasedate_group') ON DBPARTITIONNUMS (1)EXTENTSIZE 32PREFETCHSIZE AUTOMATICBUFFERPOOL IBMDEFAULTBPOVERHEAD 7.500000TRANSFERRATE 0.060000NO FILE SYSTEM CACHING DROPPED TABLE RECOVERY ON;CREATE REGULAR TABLESPACE PRODUCT_SMS IN DATABASE PARTITION GROUPPRODUCT_GROUP PAGESIZE 4096 MANAGED BY SYSTEMUSING ('d:databaseproduct_group') ON DBPARTITIONNUMS (2)EXTENTSIZE 32PREFETCHSIZE AUTOMATICBUFFERPOOL IBMDEFAULTBPOVERHEAD 7.500000TRANSFERRATE 0.060000NO FILE SYSTEM CACHING DROPPED TABLE RECOVERY ON;CREATE REGULAR TABLESPACE STORE_SMS IN DATABASE PARTITION GROUPSTORE_GROUP PAGESIZE 4096 MANAGED BY SYSTEMUSING ('d:databasestore_group') ON DBPARTITIONNUMS (3)EXTENTSIZE 32PREFETCHSIZE AUTOMATICBUFFERPOOL IBMDEFAULTBPOVERHEAD 7.500000TRANSFERRATE 0.060000NO FILE SYSTEM CACHING DROPPED TABLE RECOVERY ON;COMMIT WORK;-- Mimic tablespaceALTER TABLESPACE SYSCATSPACE PREFETCHSIZE AUTOMATIC OVERHEAD 7.500000 TRANSFERRATE 0.060000;ALTER TABLESPACE TEMPSPACE1 PREFETCHSIZE AUTOMATIC OVERHEAD 7.500000 TRANSFERRATE 0.060000;ALTER TABLESPACE USERSPACE1 PREFETCHSIZE AUTOMATIC OVERHEAD 7.500000 TRANSFERRATE 0.060000;COMMIT WORK;-------------------------------------------------- Update the bufferpool to use 1000 4K pages --------------------------------------------------ALTER BUFFERPOOL IBMDEFAULTBP SIZE 1000;COMMIT WORK;CONNECT RESET;注重:表空間被定義為 "NO FILE SYSTEM CACHING",以避免文件系統(tǒng)緩存歪曲測(cè)試各種方法時(shí)得到的評(píng)測(cè)結(jié)果。使用 db2batch 工具評(píng)測(cè)性能db2batch 程序用于運(yùn)行 清單 2 中的主查詢(xún)。為了使用 db2batch 命令運(yùn)行該查詢(xún),需要將查詢(xún)保存在一個(gè)以分號(hào)結(jié)尾的文件中,并使用以下選項(xiàng),使 db2batch 工具查看計(jì)時(shí)情況:清單 12. 使用 db2batch 評(píng)測(cè)查詢(xún)的性能db2batch -d <dbname> -f <input_file> -i <elapsed_time> -iso <isolation level>-o p <perf_detail> o <optlevel> r <rows_out> -r <result_file>其中 <dbname> 是數(shù)據(jù)庫(kù)名稱(chēng),<input_file> 是以分號(hào)結(jié)尾、包含查詢(xún)的文件。-iso <isolation level>:在我們的測(cè)試中,默認(rèn)隔離級(jí)別是 CS,但是默認(rèn)情況下 db2batch 工具使用隔離級(jí)別 RR。假如使用隔離級(jí)別 RR 執(zhí)行一個(gè)查詢(xún),那么使用隔離級(jí)別 CS 創(chuàng)建的 MQT 不會(huì)被考慮。為了解決這個(gè)問(wèn)題,可以在 db2batch 命令中使用 -iso 選項(xiàng)和隔離級(jí)別 CS,以便查詢(xún)選擇 MQT。而且,應(yīng)用程序可使用默認(rèn)的 CS 隔離級(jí)別,不帶 -iso 選項(xiàng)運(yùn)行 db2batch 會(huì)導(dǎo)致它使用 RR 隔離級(jí)別,并可能導(dǎo)致鎖爭(zhēng)用。-o - options options:p <perf_detail>: 性能具體信息。返回?cái)?shù)據(jù)庫(kù)治理器、數(shù)據(jù)庫(kù)、應(yīng)用程序和語(yǔ)句的快照(只有在自動(dòng)提交關(guān)閉,且處理的是單個(gè)語(yǔ)句,而非語(yǔ)句塊時(shí),才返回語(yǔ)句快照)。另外還返回緩沖池、表空間和 FCM的快照(只有在多數(shù)據(jù)庫(kù)分區(qū)環(huán)境中才會(huì)返回 FCM 快照)。 對(duì)于例子 p 5,我們使用最具體的輸出,但是也可以使用不同級(jí)別的性能輸出。o <optlevel>: 查詢(xún)優(yōu)化級(jí)別。(本文使用優(yōu)化級(jí)別 5,這里不需要顯式地指定這個(gè)優(yōu)化級(jí)別,因?yàn)樗菙?shù)據(jù)庫(kù)的默認(rèn)優(yōu)化級(jí)別,如 清單 10 所示。)r <rows_out>: 所獲取且將發(fā)送到輸出的行數(shù)。我們的例子 r 0 不發(fā)送行。-r <result_file>: 結(jié)果文件。在我們的例子中,results.txt 是輸出文件名,db2batch 將結(jié)果輸出到該文件中。在本文中,我們使用:db2batch -d DSS_DB -f QUERY1.SQL -i complete -iso CS -o p 5 o 5 r 0 -r <output filename>提高查詢(xún)性能的方法在本節(jié)中,讓我們逐步了解用于提高 清單 2 中描述的查詢(xún)的性能的各種不同方法。在討論任何方法之前,必須創(chuàng)建基本的事實(shí)表和維度表。步驟 A:創(chuàng)建好表空間之后,就要?jiǎng)?chuàng)建事實(shí)表和維度表??梢詫?SKAPOOR 改為符合您自己環(huán)境的模式名。這樣做時(shí),務(wù)必更新 清單 2 中的查詢(xún),以反映適當(dāng)?shù)哪J矫?。可以將下面的語(yǔ)句復(fù)制到一個(gè)名為 TEST1.ddl 的文件中,然后使用以下命令來(lái)執(zhí)行該文件:db2 -tvf TEST1.ddl -z test1.log清單 13. TEST1.ddl 的內(nèi)容CONNECT TO DSS_DB;----------------------------------------------------- DDL Statements for table "SKAPOOR "."SALES_FACT"---------------------------------------------------CREATE TABLE "SKAPOOR "."SALES_FACT" ( "DATE_ID" DATE , "PRODUCT_ID" INTEGER , "STORE_ID" INTEGER , "QUANTITY" INTEGER , "PRICE" INTEGER , "TRANSACTION_DETAILS" CHAR(100) ) DISTRIBUTE BY HASH("DATE_ID") IN "FACT_SMS" ;--------------------------------------------------- DDL Statements for table "SKAPOOR "."DATE_DIM"-------------------------------------------------CREATE TABLE "SKAPOOR "."DATE_DIM" ( "DATE_ID" DATE NOT NULL , "MONTH" INTEGER , "QUARTER" INTEGER , "YEAR" INTEGER ) IN "DATE_SMS" ;-- DDL Statements for primary key on Table "SKAPOOR "."DATE_DIM"-- DATE_ID is the unique identifierALTER TABLE "SKAPOOR "."DATE_DIM"ADD PRIMARY KEY("DATE_ID");------------------------------------------------------ DDL Statements for table "SKAPOOR "."PRODUCT_DIM"----------------------------------------------------CREATE TABLE "SKAPOOR "."PRODUCT_DIM" ( "PRODUCT_ID" INTEGER NOT NULL , "PRODUCT_DESC" CHAR(20) , "MODEL" CHAR(10) , "MAKE" CHAR(10) ) IN "PRODUCT_SMS" ;-- DDL Statements for primary key on Table "SKAPOOR "."PRODUCT_DIM"-- PRODUCT_ID is the unique identifierALTER TABLE "SKAPOOR "."PRODUCT_DIM"ADD PRIMARY KEY("PRODUCT_ID");---------------------------------------------------- DDL Statements for table "SKAPOOR "."STORE_DIM"--------------------------------------------------CREATE TABLE "SKAPOOR "."STORE_DIM" ( "STORE_ID" INTEGER NOT NULL , "LOCATION" CHAR(15) , "DISTRICT" CHAR(15) , "REGION" CHAR(15) ) IN "STORE_SMS" ;-- DDL Statements for primary key on Table "SKAPOOR "."STORE_DIM"-- STORE_ID is the unique identifierALTER TABLE "SKAPOOR "."STORE_DIM"ADD PRIMARY KEY("STORE_ID");COMMIT WORK;CONNECT RESET;步驟 B:創(chuàng)建好表后,將數(shù)據(jù)插入到三個(gè)維度表中,并根據(jù)您自己的環(huán)境調(diào)整模式:清單 14. 填充 DATE_DIM 表db2 -td@ -vf date_insert.txt -z date_insert.log清單 15. 填充 PRODUCT_DIM 表db2 -td@ -vf product_insert.txt -z product_insert.log清單 16. 填充 STORE_DIM 表db2 -td@ -vf store_insert.txt -z store_insert.log這三個(gè)文件的內(nèi)容是:DATE_DIM 表被填入 2006 年所有 365 天的值。清單 17. date_insert.txt 的內(nèi)容connect to dss_db@begin atomic declare cnt INT default 1; declare dat DATE default '01/01/2006'; declare yer INT default 2006; declare quart INT default 1;while (cnt <= 365) doif (int(dat + cnt DAYS)/100) between 200601 and 200603 then set quart=1;elseif (int(dat + cnt DAYS)/100) between 200604 and 200606 then set quart=2;elseif (int(dat + cnt DAYS)/100) between 200607 and 200609 then set quart=3;elseif (int(dat + cnt DAYS)/100) between 200610 and 200612 then set quart=4;end if;insert into SKAPOOR.DATE_DIM values (dat + cnt DAYS,(int(dat + cnt DAYS)/100) - 200600,quart,yer); set cnt=cnt+1;end while;end@connect reset@PRODUCT_DIM 表被填入 60,000 種產(chǎn)品。清單 18. product_insert.txt 的內(nèi)容connect to dss_db@drop sequence seq1@drop sequence seq2@create sequence seq1 as integer start with 1 increment by 1@create sequence seq2 as integer start with 1 increment by 1@begin atomic declare cnt INT default 1; while (cnt < 60001) doinsert into SKAPOOR.PRODUCT_DIM values (nextval for SEQ2,'product desc' concat char(nextval for SEQ1),'model ' concat char(integer(rand()*1000)),'maker ' concat char(integer(rand()*500)));set cnt=cnt+1;end while;end@drop sequence seq1@drop sequence seq2@connect reset@STORE_DIM 表被填入 201 家商店。清單 19. store_insert.txt 的內(nèi)容connect to dss_db@drop sequence seq2@create sequence seq2 as integer start with 0 increment by 1@begin atomicdeclare cnt INT default 1;while (cnt < 202) do insert into SKAPOOR.STORE_DIM values (nextval for SEQ2,'location' concat char(integer(rand()*500)),'district' concat char(integer(rand()*10)),'region' concat char(integer(rand()*5)) ); set cnt=cnt+1;end while;end@drop sequence seq2@connect reset@步驟 C:將數(shù)據(jù)插入到 SALES_FACT 表中。根據(jù)您自己的環(huán)境調(diào)整模式。在我們的測(cè)試環(huán)境中,將數(shù)據(jù)插入到事實(shí)表花了約一個(gè)半小時(shí)的時(shí)間。清單 20. 填充 SALES_FACT 表db2 -td@ -vf sales_fact_insert.ddl -z sales_fact_insert.log清單 21. sales_fact_insert.ddl 的內(nèi)容connect to dss_db@VALUES (CURRENT TIMESTAMP)@begin atomic declare cnt INT default 1; declare cnt1 INT default 1; declare dat DATE default '01/01/2006'; while (cnt <= 365) doINSERT INTO SKAPOOR.SALES_FACTwith v(DATE_ID, PRODUCT_ID, STORE_ID, QUANTITY, PRICE, TRANSACTION_DETAILS, U_ID) as (values(dat + CNT1 DAYS, 1, 1, 1, 1, '', 1) union all select DATE_ID, int(rand()*59999) + 1, int(rand()*200), int(rand()*50) + 1, INT(RAND()*200 + 1), RESERVE, U_ID + 1 from v where U_ID < 60000) select date_id, product_id, store_id, quantity, price, transaction_details from v; set cnt1 = cnt1 + 1; set cnt = cnt + 1; end while;end@VALUES (CURRENT TIMESTAMP)@connect reset@注重:在 清單 21 中,SALES_FACT 表是在一次事務(wù)處理中填充的,這需要大量的磁盤(pán)空間來(lái)作日志記錄。為了降低日志記錄的影響,可以創(chuàng)建一個(gè)存儲(chǔ)過(guò)程,并分步提交插入內(nèi)容:清單 22. 填充 SALES_FACT 表的另一種方法connect to dss_db@VALUES (CURRENT TIMESTAMP)@-- Create a procedure to populate the SALES_FACT table-- committing the inserts in stages to reduce the impact-- of loggingcreate procedure salesFactPopulate()specific salesFactPopulatelanguage sqlbegin declare cnt INT default 1; declare cnt1 INT default 1; declare dat DATE default '01/01/2006'; while (cnt <= 365) doINSERT INTO SKAPOOR.SALES_FACTwith v(DATE_ID, PRODUCT_ID, STORE_ID, QUANTITY, PRICE, TRANSACTION_DETAILS, U_ID) as( values(dat + CNT1 DAYS, 1, 1, 1, 1, '', 1) union all select DATE_ID, int(rand()*59999) + 1, int(rand()*200), int(rand()*50) + 1, INT(RAND()*200 + 1), RESERVE, U_ID + 1 from vwhere U_ID < 60000)select date_id, product_id, store_id, quantity, price, TRANSACTION_DETAILS from v;commit work;set cnt1 = cnt1 + 1;set cnt=cnt+1; end while;end@-- populate the SALES_FACT tableinvoke salesFactPopulate@VALUES (CURRENT TIMESTAMP)@connect reset@步驟 D:為了理解各種不同的方法對(duì)所選查詢(xún)?cè)L問(wèn)計(jì)劃的有怎樣的影響,我們需要解釋?zhuān)‥xplain)查詢(xún),以查看 DB2 查詢(xún)優(yōu)化器選擇的訪問(wèn)計(jì)劃。為此,可使用 EXPLAIN 工具,這要求存在 EXPLAIN 表。為了創(chuàng)建 EXPLAIN 表,執(zhí)行以下步驟:1、進(jìn)入 sqllibmisc 目錄所在的位置。2、在我們的測(cè)試環(huán)境中,這個(gè)位置為 "C:Program FilesIBMSQLLIBMISC"。3、執(zhí)行 db2 connect to dss_db。4、執(zhí)行 db2 -tvf EXPLAIN .DDL。
標(biāo)簽:
DB2
數(shù)據(jù)庫(kù)
排行榜
