|
在測試系統(tǒng)上重新創(chuàng)建優(yōu)化器/查詢計(jì)劃問題的示例 示例 1: OS:Windows 2000 DB2LEVEL:V8.2 Fixpack 8 ESE 單分區(qū) 測試并復(fù)制相同的 OS 和 db2level。 數(shù)據(jù)庫: 生產(chǎn)數(shù)據(jù)庫:SAMPLE 測試數(shù)據(jù)庫:DUMMYDB 使用下列命令創(chuàng)建 Sample 數(shù)據(jù)庫:db2sampl 使用下列命令創(chuàng)建 Dummy 數(shù)據(jù)庫: db2 create db DUMMYDB
注意:用與生產(chǎn)中相同的代碼頁、地區(qū)和排序序列創(chuàng)建 TEST 數(shù)據(jù)庫。
生產(chǎn)環(huán)境:
-------------------------------------------------------- -- Database SAMPLE and Database Manager configuration parameters -------------------------------------------------------- UPDATE DBM CFG USING cpuspeed 9.446886e-007; UPDATE DBM CFG USING intra_parallel NO; UPDATE DBM CFG USING federated NO; UPDATE DBM CFG USING fed_noauth NO;
!db2fopt SAMPLE update opt_buffpage 250; !db2fopt SAMPLE update opt_sortheap 256;
UPDATE DB CFG FOR SAMPLE USING locklist 50; UPDATE DB CFG FOR SAMPLE USING dft_degree 1; UPDATE DB CFG FOR SAMPLE USING maxlocks 22; UPDATE DB CFG FOR SAMPLE USING avg_appls 1; UPDATE DB CFG FOR SAMPLE USING stmtheap 2048; UPDATE DB CFG FOR SAMPLE USING dft_queryopt 5;
--------------------------------- -- Environment Variables settings ---------------------------------
!db2set DB2_INLIST_TO_NLJN=yes; !db2set DB2_HASH_JOIN=yes;
除了以上設(shè)置,還應(yīng)在數(shù)據(jù)庫配置中注意下列配置:
db2 get db cfg for sample > dbcfg_sample.out
Database heap (4KB) (DBHEAP) = 600 SQL statement heap (4KB) (STMTHEAP) = 2048 Number of frequent values retained (NUM_FREQVALUES) = 10 Number of quantiles retained (NUM_QUANTILES) = 20
確保在修改數(shù)據(jù)庫管理器配置(dbm cfg)之后停止并啟動(dòng)該實(shí)例。對(duì)于 sample 數(shù)據(jù)庫,按下列方式對(duì) ORG 和 SALES 表運(yùn)行 runstats:
db2 connect to sample db2 runstats on table <schema>.org with distribution and indexes all db2 runstats on table <schema>.sales with distribution and indexes all db2 terminate
現(xiàn)在,通過執(zhí)行 EXPLAIN.DDL 文件生成 EXPLAIN 表,該文件在 <install directory>\sqllib\misc 目錄下:
db2 connect to sample db2 -tvf <intall path>\EXPLAIN.DDL db2 terminate
在名為 query.sql 的文件中保存下列命令:
connect to sample set current explain mode explain select * from org a, staff b where a.deptnumb=b.dept and b.dept=15 set current explain mode no terminate
現(xiàn)在,按下列方式執(zhí)行該文件:
db2 -tvf query.sql
上面將僅僅以解釋模式編譯查詢。您將在屏幕上看到:
C:\>db2 -tvf query.sql connect to sample
Database Connection Information
Database server = DB2/NT 8.2.1 SQL authorization ID = SKAPOOR Local database alias = SAMPLE
set current explain mode explain DB20000I The SQL command completed successfully.
select * from org a, staff b where a.deptnumb=b.dept and b.dept=15 SQL0217W The statement was not executed as only Explain information requests are being processed. SQLSTATE=01604
set current explain mode no DB20000I The SQL command completed successfully.
C:\>db2 terminate DB20000I The TERMINATE command completed successfully.
使用 db2exfmt 生成訪問計(jì)劃,如下:
db2exfmt -d SAMPLE -g TIC -w -1 -n % -s % -# 0 -o prod_sample_exfmt.txt
檢查 prod_sample_exfmt.txt 文件的內(nèi)容。您將看到生成了下面的訪問計(jì)劃:
Access Plan: ----------- Total Cost: 25.8823 Query Degree: 1
Rows RETURN ( 1) Cost I/O | 4 HSJOIN ( 2) 25.8823 2 /-----+-----\ 4 1 TBSCAN TBSCAN ( 3) ( 4) 12.9682 12.913 1 1 | | 35 8 TABLE: SKAPOOR TABLE: SKAPOOR STAFF ORG
現(xiàn)在,這就是您要在生產(chǎn) sample 數(shù)據(jù)庫上繼續(xù)的計(jì)劃。您需要在測試環(huán)境中模擬該計(jì)劃。 從生產(chǎn) sample 數(shù)據(jù)庫中收集下列信息:
db2look -d SAMPLE -l -o storage.out db2look -d SAMPLE -f -fd -o config.out db2look -d SAMPLE -e -a -m -t ORG SALES -o table.ddl
測試環(huán)境: 修改上面將數(shù)據(jù)庫從 SAMPLE 連接到 DUMMYDB 時(shí)所收集的每個(gè)文件中的數(shù)據(jù)庫名。 例如,如果您查看了 3 個(gè)文件的內(nèi)容,就會(huì)注意到: CONNECT TO SAMPLE;
將它修改為: CONNECT TO DUMMYDB;
在測試環(huán)境中接管這些文件。本例中,所有的表都是在默認(rèn)的表空間 USERSPACE1 中創(chuàng)建的。因此,它們也應(yīng)在測試系統(tǒng)上相同的 SMS 表空間中用 storage.out 中轉(zhuǎn)儲(chǔ)的相同配置(包括 PREFETCHSIZE、EXTENTSIZE 等)進(jìn)行創(chuàng)建。 在 config.out 文件中進(jìn)行少量修改。將下列內(nèi)容: UPDATE DB CFG FOR SAMPLE USING dft_queryopt 5;
修改為 UPDATE DB CFG FOR SAMPLE USING dft_queryopt 3;
并保存 config.out 文件。 現(xiàn)在,執(zhí)行 storage.out、config.out 和 table.ddl,如下:
db2 -tvf storage.out > storage_output.out db2 -tvf config.out > config_output.out db2 -tvf table.ddl > table.out
檢查輸出文件以確保所有命令都成功運(yùn)行了。并且按照生產(chǎn)環(huán)境設(shè)置中所顯示的用于 SAMPLE DB 的設(shè)置來修改 DBHEAP、STMTHEAP、NUM_FREQVALUES、NUM_QUANTILES,使它們適用于 DUMMYDB。同時(shí),檢查注冊(cè)表變量設(shè)置是否盡可能地相同。 使用 db2stop 和 db2start 停止并啟動(dòng)該實(shí)例。重新為 DUMMYDB 數(shù)據(jù)庫創(chuàng)建解釋表:
db2 connect to dummydb; <install path>\sqllib\misc\db2 -tvf EXPLAIN.DDL db2 terminate;
現(xiàn)在,對(duì) DUMMYDB 數(shù)據(jù)庫運(yùn)行查詢,在前面對(duì) SAMPLE 數(shù)據(jù)庫運(yùn)行查詢時(shí)所生成的 query.sql 文件中將數(shù)據(jù)庫名從 SAMPLE 修改為 DUMMYDB。
C:\>db2 -tvf query.sql connect to dummydb
Database Connection Information
Database server = DB2/NT 8.2.1 SQL authorization ID = SKAPOOR Local database alias = DUMMYDB
set current explain mode explain DB20000I The SQL command completed successfully.
select * from org a, staff b where a.deptnumb=b.dept and b.dept=15 SQL0217W The statement was not executed as only Explain information requests are being processed. SQLSTATE=01604
set current explain mode no DB20000I The SQL command completed successfully.
C:\>db2 terminate DB20000I The TERMINATE command completed successfully.
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!