PRODUCT_DIM DATE_DIM
/
/
SALES_FACT
|
|
STORE_DIM
其中的表的定義如下:表名 | 類型 | 列名 | 數(shù)據(jù)類型 | 列描述 |
SALES_FACT | FACT TABLE | DATE_ID | DATE | 產(chǎn)品售出日期 |
PRODUCT_ID | INT | 所購買產(chǎn)品的標(biāo)識符 | ||
STORE_ID | INT | 出售產(chǎn)品的商店的標(biāo)識符 | ||
QUANTITY | INT | 這次交易中售出產(chǎn)品的數(shù)量 | ||
PRICE | INT | 產(chǎn)品購買價格。[為了簡單起見,該字段為整型,但是使用小數(shù)型更符合實際] | ||
TRANSACTION_DETAILS | CHAR(100) | 關(guān)于此次交易的描述/具體信息 | ||
DATE_DIM | DIMENSION TABLE | DATE_ID NOT NULL | DATE | 惟一標(biāo)識符 |
MONTH | INT | 日期記錄所屬的月份 | ||
QUARTER | INT | 日期記錄所屬的季度(第 1、第 2、第 3 或第 4 季度) | ||
YEAR | INT | 日期記錄所屬的年份 | ||
PRODUCT_DIM | DIMENSION TABLE | PRODUCT_ID NOT NULL | INT | 產(chǎn)品惟一標(biāo)識符 |
PRODUCT_DESC | CHAR(20) | 對產(chǎn)品的描述 | ||
MODEL | CHAR(200) | 產(chǎn)品型號 | ||
MAKE | CHAR(50) | 產(chǎn)品的質(zhì)地 | ||
STORE_DIM | DIMENSION TABLE | STORE_ID NOT NULL | INT | 商店惟一標(biāo)識符 |
LOCATION | CHAR(15) | 商店位置 | ||
DISTRICT | CHAR(15) | 商店所屬街區(qū) | ||
REGION | CHAR(15) | 商店所屬區(qū)域 |
數(shù)據(jù)庫分區(qū)組名 | 數(shù)據(jù)庫分區(qū)數(shù) |
FACT_GROUP | 0,1,2,3 |
DATE_GROUP | 1 |
PRODUCT_GROUP | 2 |
STORE_GROUP | 3 |
表空間名 | 數(shù)據(jù)庫分區(qū)組 | 表 |
FACT_SMS | FACT_GROUP | SALES_FACT |
DATE_SMS | DATE_GROUP | DATE_DIM |
PRODUCT_SMS | PRODUCT_GROUP | PRODUCT_DIM |
STORE_SMS | STORE_GROUP | STORE_DIM |
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。 新聞熱點
疑難解答
圖片精選