程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> 提高商業智能環境中DB2查詢的性能(1)

提高商業智能環境中DB2查詢的性能(1)

編輯:DB2教程

高效地運行大型查詢,是商業智能環境中的頂級性能挑戰。學習在這種環境中提高 IBM® DB2® 數據服務器查詢性能的技巧。逐步了解各種不同的方法,然後在自己的系統上進行試驗。將每種方法應用於一條 SQL 語句,並使用 db2batch 工具評測性能。

簡介

本文主要討論可以使決策支持系統(DSS)中的大型查詢高效地執行的一些方法。這些查詢通常都是訪問較多數據的單純 select 查詢。下面是我們要討論的一些方法:

1、建立適當的參照完整性約束

2、使用物化查詢表(MQT)將表復制到其它數據庫分區,以允許非分區鍵列上的合並連接

3、使用多維集群(MDC)

4、使用表分區(DB2® 9 的新功能)

5、結合使用表分區和多維集群

6、使用 MQT 預先計算聚合結果

本文中的例子針對 Windows 平台上運行的 DB2 9。但是,其中的概念和信息對於任何平台都是有用的。由於大多數商業智能(BI)環境都使用 DB2 Database Partitioning Feature(DPF,DB2 數據庫分區特性),我們的例子也使用 DPF 將數據劃分到多個物理和邏輯分區之中。

數據庫布局和設置

本節描述用於在我們的系統上執行測試的數據庫的物理和邏輯布局。

星型模式布局

本文使用如下所示的星型模式:

清單 1. 星型模式                 PRODUCT_DIM       DATE_DIM
                            /
                            /
                       SALES_FACT
                         |
                         |
                   STORE_DIM

其中的表的定義如下:

表名 類型 列名 數據類型 列描述 SALES_FACT FACT TABLE DATE_ID DATE 產品售出日期 PRODUCT_ID INT 所購買產品的標識符 STORE_ID INT 出售產品的商店的標識符 QUANTITY INT 這次交易中售出產品的數量 PRICE INT 產品購買價格。[為了簡單起見,該字段為整型,但是使用小數型更符合實際] TRANSACTION_DETAILS CHAR(100) 關於此次交易的描述/詳細信息 DATE_DIM DIMENSION TABLE DATE_ID NOT NULL DATE 惟一標識符 MONTH INT 日期記錄所屬的月份 QUARTER INT 日期記錄所屬的季度(第 1、第 2、第 3 或第 4 季度) YEAR INT 日期記錄所屬的年份 PRODUCT_DIM DIMENSION TABLE PRODUCT_ID NOT NULL INT 產品惟一標識符 PRODUCT_DESC CHAR(20) 對產品的描述 MODEL CHAR(200) 產品型號 MAKE CHAR(50) 產品的質地 STORE_DIM DIMENSION TABLE STORE_ID NOT NULL INT 商店惟一標識符 LOCATION CHAR(15) 商店位置 DISTRICT CHAR(15) 商店所屬街區 REGION CHAR(15) 商店所屬區域

事實表 SALES_FACT 包含 2006 年的總體銷售信息。它包括產品售出日期、產品 ID、銷售該產品的商店的 ID、售出的特定產品的數量,以及產品的價格。事實表中還添加了 TRANSACTION_DETAILS 列,以便在從事實表中訪問數據時生成更多的 I/O。

維度表 DATE_DIM 包含商店開放期間的惟一的日期和相應的月份、季度和年份信息。

維度表 PRODUCT_DIM 包含公司所銷售的不同產品。每種產品有一個惟一的產品 ID 和一個產品描述、型號以及質地。

維度表 STORE_DIM 包含不同的商店 ID 和商店的位置、所屬街區以及所屬區域等信息。

數據庫分區信息

數據庫分區組名 數據庫分區數 FACT_GROUP 0,1,2,3 DATE_GROUP 1 PRODUCT_GROUP 2 STORE_GROUP 3

各表都位於它自己的分區組中。3 個維度表都比較小,所以它們位於一個數據庫分區上。而事實表則跨 4 個分區。

表空間信息

表空間名 數據庫分區組 表 FACT_SMS FACT_GROUP SALES_FACT DATE_SMS DATE_GROUP DATE_DIM PRODUCT_SMS PRODUCT_GROUP PRODUCT_DIM STORE_SMS STORE_GROUP STORE_DIM

各表都位於自己的表空間中。還有一種常見的方法是將這 3 個維度表放在同一個表空間中。

緩沖池信息

本文中的測試所使用的默認緩沖池是 IBMDEFAULTBP,該緩沖池由 1,000 個 4K 的頁面組成。在本文的測試中,所有表空間共享這個緩沖池。在通常的 BI 環境中,會創建不同的緩沖池。

主查詢

下面的查詢用於測試本文中討論的各種不同的方法。該查詢執行一個向外連接,比較二月份和十一月份 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;

環境設置

本文的測試是使用以下環境執行的:

清單 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. 操作系統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

空間需求

為了重新創建本文中描述的所有測試用例,需要高達 20Gb 的磁盤空間來存放數據和日志文件。其中將近 13Gb 的空間要分配給日志文件。我們要使用循環日志記錄,分配 100 個主日志:

清單 6. 用於日志的數據庫配置Log file size (4KB)             (LOGFILSIZ) = 8192
Number of primary log files        (LOGPRIMARY) = 100
Number of secondary log files        (LOGSECOND) = 150

略加修改為事實表填充數據的腳本,即可減少日志文件所需的磁盤空間。本文的後面將對此進行討論。

設置數據庫

第一步是創建一個測試數據庫。

在本文的測試中,創建了 4 個邏輯數據分區。在 etcservices 文件中,應確保有足夠的端口用於創建 4 個數據分區。在我們的測試環境中,文件 C:Windowssystem32driversetcservices 中包含關於實例 "DB2" 的以下內容:

清單 7. services 文件的內容DB2_DB2      60000/tcp
DB2_DB2_1     60001/tcp
DB2_DB2_2     60002/tcp
DB2_DB2_END    60003/tcp
DB2c_DB2     50000/tcp

為向實例添加數據庫分區,可使用 DB2 CLP 執行以下命令:

清單 8. 使用 db2ncrt 命令創建數據庫分區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 選項所表示的實例名應該根據您自己的環境加以修改。

創建數據庫

創建數據庫 DSS_DB。這裡使用 D: 盤存儲該數據庫。請根據您自己的環境進行調整。

清單 9. 創建數據庫的命令db2 create database dss_db on D:;

數據庫和數據庫管理器是使用下面的設置來配置的。db2_all 工具用於設置所有數據庫分區上的數據庫配置和數據庫管理器配置。

清單 10. 更新數據庫管理器配置的語句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

創建數據庫分區組和表空間

使用以下語句創建數據庫分區組和表空間。可以將這些語句復制到一個名為 STORAGE.ddl 的文件中,然後使用下面的命令執行它們:

db2 -tvf STORAGE.ddl -z storage.log

清單 11. 創建數據庫分區組和表空間的語句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",以避免文件系統緩存歪曲測試各種方法時得到的評測結果。

使用 db2batch 工具評測性能

db2batch 程序用於運行 清單 2 中的主查詢。為了使用 db2batch 命令運行該查詢,需要將查詢保存在一個以分號結尾的文件中,並使用以下選項,使 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> 是數據庫名稱,<input_file> 是以分號結尾、包含查詢的文件。

-iso <isolation level>:

在我們的測試中,默認隔離級別是 CS,但是默認情況下 db2batch 工具使用隔離級別 RR。如果使用隔離級別 RR 執行一個查詢,那麼使用隔離級別 CS 創建的 MQT 不會被考慮。為了解決這個問題,可以在 db2batch 命令中使用 -iso 選項和隔離級別 CS,以便查詢選擇 MQT。而且,應用程序可使用默認的 CS 隔離級別,不帶 -iso 選項運行 db2batch 會導致它使用 RR 隔離級別,並可能導致鎖爭用。

-o - options options:

p <perf_detail>: 性能詳細信息。返回數據庫管理器、數據庫、應用程序和語句的快照(只有在自動提交關閉,且處理的是單個語句,而非語句塊時,才返回語句快照)。另外還返回緩沖池、表空間和 FCM的快照(只有在多數據庫分區環境中才會返回 FCM 快照)。 對於例子 p 5,我們使用最詳細的輸出,但是也可以使用不同級別的性能輸出。

o <optlevel>: 查詢優化級別。(本文使用優化級別 5,這裡不需要顯式地指定這個優化級別,因為它是數據庫的默認優化級別,如 清單 10 所示。)

r <rows_out>: 所獲取且將發送到輸出的行數。我們的例子 r 0 不發送行。

-r <result_file>: 結果文件。在我們的例子中,results.txt 是輸出文件名,db2batch 將結果輸出到該文件中。

在本文中,我們使用:

db2batch -d DSS_DB -f QUERY1.SQL -i complete -iso CS -o p 5 o 5 r 0 -r <output filename>

提高查詢性能的方法

在本節中,讓我們逐步了解用於提高 清單 2 中描述的查詢的性能的各種不同方法。在討論任何方法之前,必須創建基本的事實表和維度表。

步驟 A:創建好表空間之後,就要創建事實表和維度表。可以將 SKAPOOR 改為符合您自己環境的模式名。這樣做時,務必更新 清單 2 中的查詢,以反映適當的模式名。可以將下面的語句復制到一個名為 TEST1.ddl 的文件中,然後使用以下命令來執行該文件:db2 -tvf TEST1.ddl -z test1.log

清單 13. TEST1.ddl 的內容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:創建好表後,將數據插入到三個維度表中,並根據您自己的環境調整模式:

清單 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

這三個文件的內容是:

DATE_DIM 表被填入 2006 年所有 365 天的值。

清單 17. date_insert.txt 的內容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 種產品。

清單 18. product_insert.txt 的內容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 的內容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:將數據插入到 SALES_FACT 表中。根據您自己的環境調整模式。在我們的測試環境中,將數據插入到事實表花了約一個半小時的時間。

清單 20. 填充 SALES_FACT 表db2 -td@ -vf sales_fact_insert.ddl -z sales_fact_insert.log

清單 21. sales_fact_insert.ddl 的內容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 表是在一次事務處理中填充的,這需要大量的磁盤空間來作日志記錄。為了降低日志記錄的影響,可以創建一個存儲過程,並分步提交插入內容:

清單 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 查詢優化器選擇的訪問計劃。為此,可使用 EXPLAIN 工具,這要求存在 EXPLAIN 表。為了創建 EXPLAIN 表,執行以下步驟:

1、進入 sqllibmisc 目錄所在的位置。

2、在我們的測試環境中,這個位置為 "C:Program FilesIBMSQLLIBMISC"。

3、執行 db2 connect to dss_db。

4、執行 db2 -tvf EXPLAIN .DDL。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved