国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

提高商業(yè)智能環(huán)境中DB2查詢的性能(1)

2024-07-21 02:41:37
字體:
供稿:網(wǎng)友
  高效地運行大型查詢,是商業(yè)智能環(huán)境中的頂級性能挑戰(zhàn)。學(xué)習(xí)在這種環(huán)境中提高 IBM® DB2® 數(shù)據(jù)服務(wù)器查詢性能的技巧。逐步了解各種不同的方法,然后在自己的系統(tǒng)上進行試驗。將每種方法應(yīng)用于一條 SQL 語句,并使用 db2batch 工具評測性能。  簡介  本文主要討論可以使決策支持系統(tǒng)(DSS)中的大型查詢高效地執(zhí)行的一些方法。這些查詢通常都是訪問較多數(shù)據(jù)的單純 select 查詢。下面是我們要討論的一些方法:  1、建立適當(dāng)?shù)膮⒄胀暾约s束  2、使用物化查詢表(MQT)將表復(fù)制到其它數(shù)據(jù)庫分區(qū),以答應(yīng)非分區(qū)鍵列上的合并連接  3、使用多維集群(MDC)  4、使用表分區(qū)(DB2® 9 的新功能)  5、結(jié)合使用表分區(qū)和多維集群  6、使用 MQT 預(yù)先計算聚合結(jié)果  本文中的例子針對 Windows 平臺上運行的 DB2 9。但是,其中的概念和信息對于任何平臺都是有用的。由于大多數(shù)商業(yè)智能(BI)環(huán)境都使用 DB2 Database Partitioning Feature(DPF,DB2 數(shù)據(jù)庫分區(qū)特性),我們的例子也使用 DPF 將數(shù)據(jù)劃分到多個物理和邏輯分區(qū)之中。  數(shù)據(jù)庫布局和設(shè)置  本節(jié)描述用于在我們的系統(tǒng)上執(zhí)行測試的數(shù)據(jù)庫的物理和邏輯布局。  星型模式布局  本文使用如下所示的星型模式:  清單 1. 星型模式                 PRODUCT_DIM       DATE_DIM
                            /
                            /
                       SALES_FACT
                         |
                         |
                   STORE_DIM
  其中的表的定義如下:
表名 類型 列名 數(shù)據(jù)類型 列描述
SALES_FACTFACT TABLEDATE_IDDATE產(chǎn)品售出日期
PRODUCT_IDINT所購買產(chǎn)品的標(biāo)識符
STORE_IDINT出售產(chǎn)品的商店的標(biāo)識符
QUANTITYINT這次交易中售出產(chǎn)品的數(shù)量
PRICEINT產(chǎn)品購買價格。[為了簡單起見,該字段為整型,但是使用小數(shù)型更符合實際]
TRANSACTION_DETAILSCHAR(100)關(guān)于此次交易的描述/具體信息
DATE_DIMDIMENSION TABLEDATE_ID NOT NULLDATE惟一標(biāo)識符
MONTHINT日期記錄所屬的月份
QUARTERINT日期記錄所屬的季度(第 1、第 2、第 3 或第 4 季度)
YEARINT日期記錄所屬的年份
PRODUCT_DIMDIMENSION TABLEPRODUCT_ID NOT NULLINT產(chǎn)品惟一標(biāo)識符
PRODUCT_DESCCHAR(20)對產(chǎn)品的描述
MODELCHAR(200)產(chǎn)品型號
MAKECHAR(50)產(chǎn)品的質(zhì)地
STORE_DIMDIMENSION TABLESTORE_ID NOT NULLINT商店惟一標(biāo)識符
LOCATIONCHAR(15)商店位置
DISTRICTCHAR(15)商店所屬街區(qū)
REGIONCHAR(15)商店所屬區(qū)域
  事實表 SALES_FACT 包含 2006 年的總體銷售信息。它包括產(chǎn)品售出日期、產(chǎn)品 ID、銷售該產(chǎn)品的商店的 ID、售出的特定產(chǎn)品的數(shù)量,以及產(chǎn)品的價格。事實表中還添加了 TRANSACTION_DETAILS 列,以便在從事實表中訪問數(shù)據(jù)時生成更多的 I/O。  維度表 DATE_DIM 包含商店開放期間的惟一的日期和相應(yīng)的月份、季度和年份信息。  維度表 PRODUCT_DIM 包含公司所銷售的不同產(chǎn)品。每種產(chǎn)品有一個惟一的產(chǎn)品 ID 和一個產(chǎn)品描述、型號以及質(zhì)地。  維度表 STORE_DIM 包含不同的商店 ID 和商店的位置、所屬街區(qū)以及所屬區(qū)域等信息。  數(shù)據(jù)庫分區(qū)信息
數(shù)據(jù)庫分區(qū)組名 數(shù)據(jù)庫分區(qū)數(shù)
FACT_GROUP0,1,2,3
DATE_GROUP1
PRODUCT_GROUP2
STORE_GROUP3
  各表都位于它自己的分區(qū)組中。3 個維度表都比較小,所以它們位于一個數(shù)據(jù)庫分區(qū)上。而事實表則跨 4 個分區(qū)。  表空間信息
表空間名 數(shù)據(jù)庫分區(qū)組
FACT_SMSFACT_GROUPSALES_FACT
DATE_SMSDATE_GROUPDATE_DIM
PRODUCT_SMSPRODUCT_GROUPPRODUCT_DIM
STORE_SMSSTORE_GROUPSTORE_DIM
  各表都位于自己的表空間中。還有一種常見的方法是將這 3 個維度表放在同一個表空間中。  緩沖池信息  本文中的測試所使用的默認緩沖池是 IBMDEFAULTBP,該緩沖池由 1,000 個 4K 的頁面組成。在本文的測試中,所有表空間共享這個緩沖池。在通常的 BI 環(huán)境中,會創(chuàng)建不同的緩沖池。  主查詢  下面的查詢用于測試本文中討論的各種不同的方法。該查詢執(zhí)行一個向外連接,比較二月份和十一月份 10 家商店的銷售信息。  清單 2. 主查詢 [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è)置  本文的測試是使用以下環(huán)境執(zhí)行的:  清單 3. db2levelDB2 9 Enterprise Edition:
DB21085I Instance "DB2" uses "32" bits and DB2 code release "SQL09010" with
level 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:2
Physical Memory(MB): total:2551 free:1988 available:1949
Virtual Memory(MB): total:4950 free:6575
Swap   Memory(MB): total:2399 free:4587
1 Physical disk Size 100GB
  空間需求  為了重新創(chuàng)建本文中描述的所有測試用例,需要高達 20Gb 的磁盤空間來存放數(shù)據(jù)和日志文件。其中將近 13Gb 的空間要分配給日志文件。我們要使用循環(huán)日志記錄,分配 100 個主日志:  清單 6. 用于日志的數(shù)據(jù)庫配置Log file size (4KB)             (LOGFILSIZ) = 8192
Number of primary log files        (LOGPRIMARY) = 100
Number of secondary log files        (LOGSECOND) = 150
  略加修改為事實表填充數(shù)據(jù)的腳本,即可減少日志文件所需的磁盤空間。本文的后面將對此進行討論。  設(shè)置數(shù)據(jù)庫  第一步是創(chuàng)建一個測試數(shù)據(jù)庫。  在本文的測試中,創(chuàng)建了 4 個邏輯數(shù)據(jù)分區(qū)。在 etcservices 文件中,應(yīng)確保有足夠的端口用于創(chuàng)建 4 個數(shù)據(jù)分區(qū)。在我們的測試環(huán)境中,文件 C:WINDOWSsystem32driversetcservices 中包含關(guān)于實例 "DB2" 的以下內(nèi)容:  清單 7. services 文件的內(nèi)容DB2_DB2      60000/tcp
DB2_DB2_1     60001/tcp
DB2_DB2_2     60002/tcp
DB2_DB2_END    60003/tcp
DB2c_DB2     50000/tcp
  為向?qū)嵗砑訑?shù)據(jù)庫分區(qū),可使用 DB2 CLP 執(zhí)行以下命令:  清單 8. 使用 db2ncrt 命令創(chuàng)建數(shù)據(jù)庫分區(qū)db2stop
db2ncrt /n:1 /u:username,passWord /i:DB2 /m:machine /p:1
db2ncrt /n:2 /u:username,password /i:DB2 /m:machine /p:2
db2ncrt /n:3 /u:username,password /i:DB2 /m:machine /p:3
  其中 /u 選項所表示的用戶名和密碼,/m 選項所表示的計算機名,以及 /i 選項所表示的實例名應(yīng)該根據(jù)您自己的環(huán)境加以修改。  創(chuàng)建數(shù)據(jù)庫  創(chuàng)建數(shù)據(jù)庫 DSS_DB。這里使用 D: 盤存儲該數(shù)據(jù)庫。請根據(jù)您自己的環(huán)境進行調(diào)整。  清單 9. 創(chuàng)建數(shù)據(jù)庫的命令db2 create database dss_db on D:;  數(shù)據(jù)庫和數(shù)據(jù)庫治理器是使用下面的設(shè)置來配置的。db2_all 工具用于設(shè)置所有數(shù)據(jù)庫分區(qū)上的數(shù)據(jù)庫配置和數(shù)據(jù)庫治理器配置。  清單 10. 更新數(shù)據(jù)庫治理器配置的語句db2_all update dbm cfg
   using cpuspeed 2.282997e-007 intra_parallel NO comm_bandwidth 100.000000
db2_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ù)庫分區(qū)組和表空間  使用以下語句創(chuàng)建數(shù)據(jù)庫分區(qū)組和表空間。可以將這些語句復(fù)制到一個名為 STORAGE.ddl 的文件中,然后使用下面的命令執(zhí)行它們:db2 -tvf STORAGE.ddl -z storage.log清單 11. 創(chuàng)建數(shù)據(jù)庫分區(qū)組和表空間的語句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_GROUP
  
PAGESIZE 4096 MANAGED BY SYSTEM
  
USING ('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 32
  
PREFETCHSIZE AUTOMATIC
  
BUFFERPOOL IBMDEFAULTBP
  
OVERHEAD 7.500000
  
TRANSFERRATE 0.060000
  
NO FILE SYSTEM CACHING 
  
DROPPED TABLE RECOVERY ON;
CREATE REGULAR TABLESPACE DATE_SMS IN DATABASE PARTITION GROUP
DATE_GROUP PAGESIZE 4096 MANAGED BY SYSTEM
  
USING ('d:databasedate_group') ON DBPARTITIONNUMS (1)
  
EXTENTSIZE 32
  
PREFETCHSIZE AUTOMATIC
  
BUFFERPOOL IBMDEFAULTBP
  
OVERHEAD 7.500000
  
TRANSFERRATE 0.060000
  
NO FILE SYSTEM CACHING 
  
DROPPED TABLE RECOVERY ON;
CREATE REGULAR TABLESPACE PRODUCT_SMS IN DATABASE PARTITION GROUP
PRODUCT_GROUP PAGESIZE 4096 MANAGED BY SYSTEM
  
USING ('d:databaseproduct_group') ON DBPARTITIONNUMS (2)
  
EXTENTSIZE 32
  
PREFETCHSIZE AUTOMATIC
  
BUFFERPOOL IBMDEFAULTBP
  
OVERHEAD 7.500000
  
TRANSFERRATE 0.060000
  
NO FILE SYSTEM CACHING 
  
DROPPED TABLE RECOVERY ON;
CREATE REGULAR TABLESPACE STORE_SMS IN DATABASE PARTITION GROUP
STORE_GROUP PAGESIZE 4096 MANAGED BY SYSTEM
  
USING ('d:databasestore_group') ON DBPARTITIONNUMS (3)
  
EXTENTSIZE 32
  
PREFETCHSIZE AUTOMATIC
  
BUFFERPOOL IBMDEFAULTBP
  
OVERHEAD 7.500000
  
TRANSFERRATE 0.060000
  
NO FILE SYSTEM CACHING 
  
DROPPED TABLE RECOVERY ON;
COMMIT WORK;
-- Mimic tablespace
ALTER 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)緩存歪曲測試各種方法時得到的評測結(jié)果。  使用 db2batch 工具評測性能  db2batch 程序用于運行 清單 2 中的主查詢。為了使用 db2batch 命令運行該查詢,需要將查詢保存在一個以分號結(jié)尾的文件中,并使用以下選項,使 db2batch 工具查看計時情況:  清單 12. 使用 db2batch 評測查詢的性能        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ù)庫名稱,<input_file> 是以分號結(jié)尾、包含查詢的文件。  -iso <isolation level>:  在我們的測試中,默認隔離級別是 CS,但是默認情況下 db2batch 工具使用隔離級別 RR。假如使用隔離級別 RR 執(zhí)行一個查詢,那么使用隔離級別 CS 創(chuàng)建的 MQT 不會被考慮。為了解決這個問題,可以在 db2batch 命令中使用 -iso 選項和隔離級別 CS,以便查詢選擇 MQT。而且,應(yīng)用程序可使用默認的 CS 隔離級別,不帶 -iso 選項運行 db2batch 會導(dǎo)致它使用 RR 隔離級別,并可能導(dǎo)致鎖爭用。  -o - options options:  p <perf_detail>: 性能具體信息。返回數(shù)據(jù)庫治理器、數(shù)據(jù)庫、應(yīng)用程序和語句的快照(只有在自動提交關(guān)閉,且處理的是單個語句,而非語句塊時,才返回語句快照)。另外還返回緩沖池、表空間和 FCM的快照(只有在多數(shù)據(jù)庫分區(qū)環(huán)境中才會返回 FCM 快照)。 對于例子 p 5,我們使用最具體的輸出,但是也可以使用不同級別的性能輸出。  o <optlevel>: 查詢優(yōu)化級別。(本文使用優(yōu)化級別 5,這里不需要顯式地指定這個優(yōu)化級別,因為它是數(shù)據(jù)庫的默認優(yōu)化級別,如 清單 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>  提高查詢性能的方法  在本節(jié)中,讓我們逐步了解用于提高 清單 2 中描述的查詢的性能的各種不同方法。在討論任何方法之前,必須創(chuàng)建基本的事實表和維度表。  步驟 A:創(chuàng)建好表空間之后,就要創(chuàng)建事實表和維度表。可以將 SKAPOOR 改為符合您自己環(huán)境的模式名。這樣做時,務(wù)必更新 清單 2 中的查詢,以反映適當(dāng)?shù)哪J矫?梢詫⑾旅娴恼Z句復(fù)制到一個名為 TEST1.ddl 的文件中,然后使用以下命令來執(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 identifier
ALTER 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 identifier
ALTER 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 identifier
ALTER TABLE "SKAPOOR "."STORE_DIM"
  ADD PRIMARY KEY
    ("STORE_ID");
COMMIT WORK;
CONNECT RESET;
  步驟 B:創(chuàng)建好表后,將數(shù)據(jù)插入到三個維度表中,并根據(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  這三個文件的內(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) do  
  if (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) do
  insert 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 atomic
  declare 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)整模式。在我們的測試環(huán)境中,將數(shù)據(jù)插入到事實表花了約一個半小時的時間。  清單 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) do  
  
  INSERT INTO SKAPOOR.SALES_FACT
  with 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ù)處理中填充的,這需要大量的磁盤空間來作日志記錄。為了降低日志記錄的影響,可以創(chuàng)建一個存儲過程,并分步提交插入內(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 logging
create procedure salesFactPopulate()
specific salesFactPopulate
language sql
begin
  declare cnt INT default 1;
  declare cnt1 INT default 1;
  declare dat DATE default '01/01/2006';
  while (cnt <= 365) do  
  
  INSERT INTO SKAPOOR.SALES_FACT
  with 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;
  commit work;
  set cnt1 = cnt1 + 1;
  set cnt=cnt+1;
  end while;
end@
-- populate the SALES_FACT table
invoke salesFactPopulate@
VALUES (CURRENT TIMESTAMP)@
connect reset@
  步驟 D:為了理解各種不同的方法對所選查詢訪問計劃的有怎樣的影響,我們需要解釋(Explain)查詢,以查看 DB2 查詢優(yōu)化器選擇的訪問計劃。為此,可使用 EXPLAIN 工具,這要求存在 EXPLAIN 表。為了創(chuàng)建 EXPLAIN 表,執(zhí)行以下步驟:  1、進入 sqllibmisc 目錄所在的位置。  2、在我們的測試環(huán)境中,這個位置為 "C:Program FilesIBMSQLLIBMISC"。  3、執(zhí)行 db2 connect to dss_db。  4、執(zhí)行 db2 -tvf EXPLAIN .DDL。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 奎屯市| 惠州市| 吴忠市| 青田县| 西乡县| 时尚| 阳谷县| 习水县| 泸水县| 杭锦后旗| 锡林浩特市| 青岛市| 资溪县| 新沂市| 土默特左旗| 新邵县| 讷河市| 贞丰县| 新和县| 台前县| 双江| 武鸣县| 舟山市| 望谟县| 南涧| 延寿县| 临桂县| 乐业县| 齐河县| 岑溪市| 彝良县| 南靖县| 石林| 邯郸县| 饶阳县| 安塞县| 巢湖市| 扶沟县| 嫩江县| 吉首市| 泽库县|