使用DB2look 重新創(chuàng)建優(yōu)化器訪問(wèn)計(jì)劃(1)
發(fā)表時(shí)間:2024-02-24 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]簡(jiǎn)介 在作為 DB2 UDB 支持分析員(Support Analyst)工作時(shí),我經(jīng)常從處理優(yōu)化器或查詢計(jì)劃問(wèn)題的客戶那里聽(tīng)到下列問(wèn)題: “我如何在接手生產(chǎn)環(huán)境的測(cè)試環(huán)境中重新創(chuàng)建相同的查詢?cè)L問(wèn)計(jì)劃呢?” 我們常常需要將生產(chǎn)環(huán)境復(fù)制到測(cè)試環(huán)境中,包括為查詢分析目的重新創(chuàng)建相同的訪問(wèn)計(jì)劃。 ...
簡(jiǎn)介
在作為 DB2 UDB 支持分析員(Support Analyst)工作時(shí),我經(jīng)常從處理優(yōu)化器或查詢計(jì)劃問(wèn)題的客戶那里聽(tīng)到下列問(wèn)題:
“我如何在接手生產(chǎn)環(huán)境的測(cè)試環(huán)境中重新創(chuàng)建相同的查詢?cè)L問(wèn)計(jì)劃呢?”
我們常常需要將生產(chǎn)環(huán)境復(fù)制到測(cè)試環(huán)境中,包括為查詢分析目的重新創(chuàng)建相同的訪問(wèn)計(jì)劃。
例如,在生產(chǎn)中,您可能會(huì)遇到使用糟糕訪問(wèn)計(jì)劃的查詢所導(dǎo)致的性能問(wèn)題,并且需要在測(cè)試系統(tǒng)上復(fù)制該訪問(wèn)計(jì)劃以嘗試一些不同的策略,例如操作統(tǒng)計(jì)數(shù)據(jù),修改優(yōu)化級(jí)別,對(duì) DB2 注冊(cè)表變量嘗試不同的設(shè)置等等,以便提高性能。
在理想的世界中,您需要讓測(cè)試環(huán)境盡可能接近地匹配生產(chǎn)。也就是說(shuō),您需要在兩個(gè)環(huán)境中使用完全相同的硬件、操作系統(tǒng)維護(hù)級(jí)別和配置、DB2 級(jí)別和配置,以及在測(cè)試中使用與生產(chǎn)中相同的數(shù)據(jù)。然而,并非總是可以達(dá)到這種理想情況。如果生產(chǎn)環(huán)境具有極其大量的數(shù)據(jù),您或許就沒(méi)有容量來(lái)保存生產(chǎn)系統(tǒng)的測(cè)試副本。
db2look 實(shí)用程序可以用于達(dá)到該目標(biāo),即使您無(wú)法復(fù)制所有的生產(chǎn)細(xì)節(jié)。
本文將解釋如何可以在測(cè)試系統(tǒng)上模擬生產(chǎn)系統(tǒng),而無(wú)需真正的數(shù)據(jù)來(lái)重新創(chuàng)建查詢計(jì)劃問(wèn)題。該功能將幫助您調(diào)試查詢和理解訪問(wèn)計(jì)劃問(wèn)題,且不打斷生產(chǎn)環(huán)境中的工作。但是請(qǐng)注意,如果需要測(cè)試結(jié)果訪問(wèn)計(jì)劃的執(zhí)行,則仍然需要將盡可能多的數(shù)據(jù)從生產(chǎn)環(huán)境裝入測(cè)試環(huán)境。測(cè)試系統(tǒng)和生產(chǎn)系統(tǒng)之間的差別仍然總是可能足以導(dǎo)致測(cè)試上的執(zhí)行特性不匹配生產(chǎn)上的。這部分的分析(性能調(diào)優(yōu))既是一門科學(xué),又是一門藝術(shù)。
優(yōu)化器或查詢編譯器領(lǐng)域中的其他問(wèn)題,例如 SQL0901N 錯(cuò)誤或?qū)嵗罎,也可以使用本文中所解釋的方法?lái)重新創(chuàng)建。您可以嘗試各種策略,如測(cè)試最新的補(bǔ)丁包(如果系統(tǒng)是處于更老的補(bǔ)丁級(jí)別),嘗試不同的優(yōu)化級(jí)別、不同的注冊(cè)表變量等等,以便查看這些修改是否將解決問(wèn)題。
讓我們看一看 db2look 中用于達(dá)到該目標(biāo)的選項(xiàng)。
db2look 命令及其選項(xiàng)
下面是用于從生產(chǎn)系統(tǒng)捕獲所需信息的命令:
清單 1. 重新創(chuàng)建優(yōu)化器問(wèn)題的命令
db2look -d <dbname> -l -o storage.out
db2look -d <dbname> -f -fd -o config.out
db2look -d <dbname> -e -a -m -o db2look.out
db2look -d <dbname> -e -a -m -t table1 table2 .... tableX -o table.ddl
現(xiàn)在,讓我們更詳細(xì)地看一看這些 db2look 命令選項(xiàng)。
生成緩沖池、表空間和數(shù)據(jù)庫(kù)分區(qū)組信息
db2look -d <dbname> -l -o storage.out
下面是對(duì)以上 db2look 命令中所用選項(xiàng)的描述:
-d:數(shù)據(jù)庫(kù)名 —— 該選項(xiàng)必須指定。
-l:生成數(shù)據(jù)庫(kù)布局。這是用于數(shù)據(jù)庫(kù)分區(qū)組、緩沖池和表空間的布局。
-o:將輸出重新定向到給定的文件名。如果未指定 -o 選項(xiàng),然么輸出將為標(biāo)準(zhǔn)輸出(stdout),通常是輸出到屏幕。
-l 選項(xiàng)對(duì)于模擬生產(chǎn)環(huán)境十分重要。理想情況下,您需要具有相同的緩沖池、數(shù)據(jù)庫(kù)分區(qū)組(如果處于多分區(qū)環(huán)境中)和表空間信息(包括臨時(shí)表空間)。但是,如果您受到了內(nèi)存約束,無(wú)法分配生產(chǎn)中所具有的大型緩沖池,那么就使用 db2fopt 命令。我稍后將在本小節(jié)中更詳細(xì)地討論該命令。
并非總是可以在測(cè)試中設(shè)置與生產(chǎn)中相同的表空間。例如,可能設(shè)置了大型設(shè)備,卻無(wú)法靈活地在測(cè)試中創(chuàng)建相同的設(shè)備大小。或者,可能根本無(wú)法在測(cè)試環(huán)境中獲得單獨(dú)的表空間設(shè)備。此外,或許無(wú)法在測(cè)試中設(shè)置與生產(chǎn)中相同的路徑。需要適當(dāng)?shù)馗穆窂、設(shè)備和文件以適應(yīng)測(cè)試環(huán)境。
下面是優(yōu)化器為表空間所使用的重要信息。這就是您需要確保在測(cè)試和生產(chǎn)中相同的信息。(注意:這里所展示的數(shù)字是一個(gè)例子。您應(yīng)在測(cè)試中使用與您生產(chǎn)中相同的設(shè)置。)
PREFETCHSIZE 16
EXTENTSIZE 16
OVERHEAD 12.670000
TRANSFERRATE 0.180000
如果生產(chǎn)中表空間是“由數(shù)據(jù)庫(kù)管理的”,那么在測(cè)試中也應(yīng)該是“由數(shù)據(jù)庫(kù)管理的”。如果它在生產(chǎn)中是“由系統(tǒng)管理的”,那在測(cè)試中也應(yīng)該是這樣的方式。
注意:如果這是具有多個(gè)物理分區(qū)(MPP)的系統(tǒng),那么測(cè)試中數(shù)據(jù)庫(kù)分區(qū)組中的分區(qū)數(shù)目就必須相同。然而,物理機(jī)器的數(shù)目不必相同。測(cè)試和生產(chǎn)中整個(gè) MPP 環(huán)境中邏輯分區(qū)的數(shù)目必須相同。
生成配置參數(shù)和注冊(cè)表變量
db2look -d <dbname> -f -fd -o config.out
這里,我將使用下列參數(shù):
-f:提取配置參數(shù)和注冊(cè)表變量。如果指定了該選項(xiàng),就會(huì)忽略 -wrapper 和 -server 選項(xiàng)。
-fd:為 opt_buffpage 和 opt_sortheap 生成 db2fopt 語(yǔ)句,以及其他配置和注冊(cè)表設(shè)置。
該命令的輸出如下所示:
清單 2. db2look 命令的示例輸出
$ db2look -d sample -f -fd
-- No userid was specified, db2look tries to use Environment variable USER
-- USER is: SKAPOOR
-- This CLP file was created using DB2LOOK Version 8.2
-- Timestamp: Sat Mar 26 00:13:36 EST 2005
-- Database Name: SAMPLE
-- Database Manager Version: DB2/6000 Version 8.2.2
-- Database Codepage: 819
-- Database Collating Sequence is: UNIQUE
CONNECT TO SAMPLE;
--------------------------------------------------------
-- Database and Database Manager configuration parameters
--------------------------------------------------------
UPDATE DBM CFG USING cpuspeed 6.523521e-07;
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 50000;
!db2fopt SAMPLE update opt_sortheap 10000;
UPDATE DB CFG FOR SAMPLE USING locklist 1000;
UPDATE DB CFG FOR SAMPLE USING dft_degree 1;
UPDATE DB CFG FOR SAMPLE USING maxlocks 10;
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_ANTIJOIN=yes;
!db2set DB2_INLIST_TO_NLJN=yes;
COMMIT WORK;
CONNECT RESET;
TERMINATE;
-f 和 -fd 選項(xiàng)是用于提取配置參數(shù)和注冊(cè)表變量的關(guān)鍵選項(xiàng),而優(yōu)化器將在訪問(wèn)計(jì)劃階段使用這些配置參數(shù)和環(huán)境。在上面的 清單 2 中,請(qǐng)注意下列 -fd 選項(xiàng)所產(chǎn)生的輸出:
!db2fopt SAMPLE update opt_buffpage 50000;
!db2fopt SAMPLE update opt_sortheap 10000;
db2fopt 命令告訴優(yōu)化器為“緩沖池大小(Buffer pool size)”使用指定的值,而非將可用緩沖池變量的頁(yè)面加起來(lái)。(db2exfmt 輸出中的緩沖池大小將在下面的 緩沖池大小 一節(jié)中進(jìn)行進(jìn)一步的討論。)例如,假設(shè)由于測(cè)試系統(tǒng)上的內(nèi)存約束,您無(wú)法獲得大型的緩沖池,并且希望將大小配置得相同,實(shí)際上卻不是真正有這么大。使用將生成必要的 db2fopt 命令的 -fd 選項(xiàng)來(lái)告訴優(yōu)化器使用指定大小,而非基于對(duì)該數(shù)據(jù)庫(kù)可用的緩沖池進(jìn)行計(jì)算。