|
導(dǎo)讀數(shù)據(jù)庫,簡而言之可視為電子化的文件柜——存儲(chǔ)電子文件的處所,用戶可以對(duì)文件中的數(shù)據(jù)進(jìn)行新增、截取、更新、刪除等操作。所謂“數(shù)據(jù)庫”是以一定方式儲(chǔ)存在一起、能與多個(gè)用戶共享、具有盡可能小的冗余度、與應(yīng)... 數(shù)據(jù)庫,簡而言之可視為電子化的文件柜——存儲(chǔ)電子文件的處所,用戶可以對(duì)文件中的數(shù)據(jù)進(jìn)行新增、截取、更新、刪除等操作。所謂“數(shù)據(jù)庫”是以一定方式儲(chǔ)存在一起、能與多個(gè)用戶共享、具有盡可能小的冗余度、與應(yīng)用程序彼此獨(dú)立的數(shù)據(jù)集合。 簡介 在作為 DB2 UDB 支持分析員(Support Analyst)工作時(shí),我經(jīng)常從處理優(yōu)化器或查詢計(jì)劃問題的客戶那里聽到下列問題: “我如何在接手生產(chǎn)環(huán)境的測試環(huán)境中重新創(chuàng)建相同的查詢訪問計(jì)劃呢?” 我們常常需要將生產(chǎn)環(huán)境復(fù)制到測試環(huán)境中,包括為查詢分析目的重新創(chuàng)建相同的訪問計(jì)劃。 例如,在生產(chǎn)中,您可能會(huì)遇到使用糟糕訪問計(jì)劃的查詢所導(dǎo)致的性能問題,并且需要在測試系統(tǒng)上復(fù)制該訪問計(jì)劃以嘗試一些不同的策略,例如操作統(tǒng)計(jì)數(shù)據(jù),修改優(yōu)化級(jí)別,對(duì) DB2 注冊表變量嘗試不同的設(shè)置等等,以便提高性能。 在理想的世界中,您需要讓測試環(huán)境盡可能接近地匹配生產(chǎn)。也就是說,您需要在兩個(gè)環(huán)境中使用完全相同的硬件、操作系統(tǒng)維護(hù)級(jí)別和配置、DB2 級(jí)別和配置,以及在測試中使用與生產(chǎn)中相同的數(shù)據(jù)。然而,并非總是可以達(dá)到這種理想情況。如果生產(chǎn)環(huán)境具有極其大量的數(shù)據(jù),您或許就沒有容量來保存生產(chǎn)系統(tǒng)的測試副本。 db2look 實(shí)用程序可以用于達(dá)到該目標(biāo),即使您無法復(fù)制所有的生產(chǎn)細(xì)節(jié)。 本文將解釋如何可以在測試系統(tǒng)上模擬生產(chǎn)系統(tǒng),而無需真正的數(shù)據(jù)來重新創(chuàng)建查詢計(jì)劃問題。該功能將幫助您調(diào)試查詢和理解訪問計(jì)劃問題,且不打斷生產(chǎn)環(huán)境中的工作。但是請注意,如果需要測試結(jié)果訪問計(jì)劃的執(zhí)行,則仍然需要將盡可能多的數(shù)據(jù)從生產(chǎn)環(huán)境裝入測試環(huán)境。測試系統(tǒng)和生產(chǎn)系統(tǒng)之間的差別仍然總是可能足以導(dǎo)致測試上的執(zhí)行特性不匹配生產(chǎn)上的。這部分的分析(性能調(diào)優(yōu))既是一門科學(xué),又是一門藝術(shù)。 優(yōu)化器或查詢編譯器領(lǐng)域中的其他問題,例如 SQL0901N 錯(cuò)誤或?qū)嵗罎ⅲ部梢允褂帽疚闹兴忉尩姆椒▉碇匦聞?chuàng)建。您可以嘗試各種策略,如測試最新的補(bǔ)丁包(如果系統(tǒng)是處于更老的補(bǔ)丁級(jí)別),嘗試不同的優(yōu)化級(jí)別、不同的注冊表變量等等,以便查看這些修改是否將解決問題。 讓我們看一看 db2look 中用于達(dá)到該目標(biāo)的選項(xiàng)。 db2look 命令及其選項(xiàng) 下面是用于從生產(chǎn)系統(tǒng)捕獲所需信息的命令: 清單 1. 重新創(chuàng)建優(yōu)化器問題的命令 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ù)庫分區(qū)組信息 db2look -d <dbname> -l -o storage.out 下面是對(duì)以上 db2look 命令中所用選項(xiàng)的描述: -d:數(shù)據(jù)庫名 —— 該選項(xiàng)必須指定。 -l:生成數(shù)據(jù)庫布局。這是用于數(shù)據(jù)庫分區(qū)組、緩沖池和表空間的布局。 -o:將輸出重新定向到給定的文件名。如果未指定 -o 選項(xiàng),然么輸出將為標(biāo)準(zhǔn)輸出(stdout),通常是輸出到屏幕。 -l 選項(xiàng)對(duì)于模擬生產(chǎn)環(huán)境十分重要。理想情況下,您需要具有相同的緩沖池、數(shù)據(jù)庫分區(qū)組(如果處于多分區(qū)環(huán)境中)和表空間信息(包括臨時(shí)表空間)。但是,如果您受到了內(nèi)存約束,無法分配生產(chǎn)中所具有的大型緩沖池,那么就使用 db2fopt 命令。我稍后將在本小節(jié)中更詳細(xì)地討論該命令。 并非總是可以在測試中設(shè)置與生產(chǎn)中相同的表空間。例如,可能設(shè)置了大型設(shè)備,卻無法靈活地在測試中創(chuàng)建相同的設(shè)備大小。或者,可能根本無法在測試環(huán)境中獲得單獨(dú)的表空間設(shè)備。此外,或許無法在測試中設(shè)置與生產(chǎn)中相同的路徑。需要適當(dāng)?shù)馗穆窂健⒃O(shè)備和文件以適應(yīng)測試環(huán)境。 下面是優(yōu)化器為表空間所使用的重要信息。這就是您需要確保在測試和生產(chǎn)中相同的信息。(注意:這里所展示的數(shù)字是一個(gè)例子。您應(yīng)在測試中使用與您生產(chǎn)中相同的設(shè)置。) PREFETCHSIZE 16 EXTENTSIZE 16 OVERHEAD 12.670000 TRANSFERRATE 0.180000 如果生產(chǎn)中表空間是“由數(shù)據(jù)庫管理的”,那么在測試中也應(yīng)該是“由數(shù)據(jù)庫管理的”。如果它在生產(chǎn)中是“由系統(tǒng)管理的”,那在測試中也應(yīng)該是這樣的方式。 注意:如果這是具有多個(gè)物理分區(qū)(MPP)的系統(tǒng),那么測試中數(shù)據(jù)庫分區(qū)組中的分區(qū)數(shù)目就必須相同。然而,物理機(jī)器的數(shù)目不必相同。測試和生產(chǎn)中整個(gè) MPP 環(huán)境中邏輯分區(qū)的數(shù)目必須相同。 生成配置參數(shù)和注冊表變量 db2look -d <dbname> -f -fd -o config.out 這里,我將使用下列參數(shù): -f:提取配置參數(shù)和注冊表變量。如果指定了該選項(xiàng),就會(huì)忽略 -wrapper 和 -server 選項(xiàng)。 -fd:為 opt_buffpage 和 opt_sortheap 生成 db2fopt 語句,以及其他配置和注冊表設(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ù)和注冊表變量的關(guān)鍵選項(xiàng),而優(yōu)化器將在訪問計(jì)劃階段使用這些配置參數(shù)和環(huán)境。在上面的 清單 2 中,請注意下列 -fd 選項(xiàng)所產(chǎn)生的輸出: !db2fopt SAMPLE update opt_buffpage 50000; !db2fopt SAMPLE update opt_sortheap 10000; db2fopt 命令告訴優(yōu)化器為“緩沖池大小(Buffer pool size)”使用指定的值,而非將可用緩沖池變量的頁面加起來。(db2exfmt 輸出中的緩沖池大小將在下面的 緩沖池大小 一節(jié)中進(jìn)行進(jìn)一步的討論。)例如,假設(shè)由于測試系統(tǒng)上的內(nèi)存約束,您無法獲得大型的緩沖池,并且希望將大小配置得相同,實(shí)際上卻不是真正有這么大。使用將生成必要的 db2fopt 命令的 -fd 選項(xiàng)來告訴優(yōu)化器使用指定大小,而非基于對(duì)該數(shù)據(jù)庫可用的緩沖池進(jìn)行計(jì)算。 [page_break]正如將在下面的 排序堆 一節(jié)中所看到的,它的工作方式與排序堆的相同。 如果您是一名 DBA,就可能會(huì)使用 DB2 SQL Explain Tool(db2exfmt)來獲得對(duì)于 SQL 訪問計(jì)劃的理解。db2exfmt 工具用于格式化解釋表的內(nèi)容。如果您在生產(chǎn)中使用 db2exfmt 查看一個(gè)訪問計(jì)劃的輸出,就會(huì)注意到計(jì)劃頂部的下列內(nèi)容。(注意:這些參數(shù)通常是由 db2look 輸出中的 -f 和 -fd 選項(xiàng)所選擇的,除了 dbheap 設(shè)置之外)。 清單 3. db2exfmt 的示例輸出 Database Context: ---------------- Parallelism: None CPU Speed: 6.523521e-07 Comm Speed: 100 Buffer Pool size: 50000 Sort Heap size: 10000 Database Heap size: 5120 Lock List size: 1000 Maximum Lock List: 10 Average Applications: 1 Locks Available: 7849 Package Context: --------------- SQL Type: Dynamic Optimization Level: 5 Blocking: Block All Cursors Isolation Level: Cursor Stability ---------------- STATEMENT 1 SECTION 201 ---------------- QUERYNO: 1 QUERYTAG: CLP Statement Type: Select Updatable: No Deletable: No Query Degree: 1 如果您稍稍深入查看 db2exfmt 的輸出,就在訪問計(jì)劃之后,您將看到是否具有影響優(yōu)化器計(jì)劃的注冊表設(shè)置。 注意:另外,遺憾的是,db2look -f 并非列出了所有相關(guān)的注冊表變量。您將需要添加那些遺漏的。一般來說,您測試系統(tǒng)上的注冊表變量設(shè)置應(yīng)與生產(chǎn)系統(tǒng)上的相同,或者盡可能接近。 清單 4. 影響訪問計(jì)劃的注冊表設(shè)置 1) RETURN: (Return Result) Cumulative Total Cost: 57.6764 Cumulative CPU Cost: 191909 Cumulative I/O Cost: 2 Cumulative Re-Total Cost: 5.37264 Cumulative Re-CPU Cost: 134316 Cumulative Re-I/O Cost: 0 Cumulative First Row Cost: 26.9726 Estimated Buffer pool Buffers: 2 Arguments: --------- BLDLEVEL: (Build level) DB2 v8.1.0.80 : s041221 ENVVAR : (Environment Variable) DB2_ANTIJOIN=yes DB2_INLIST_TO_NLJN = yes STMTHEAP: (Statement heap size) 2048 創(chuàng)建數(shù)據(jù)定義語言(DDL) 下列 db2look 命令創(chuàng)建了 DDL 以復(fù)制所有數(shù)據(jù)庫對(duì)象,以及配置和統(tǒng)計(jì)信息。 db2look -d <dbname> -e -a -m -o db2look.out 這里,我們使用了下列參數(shù): -a:為所有的創(chuàng)建器(creator)生成統(tǒng)計(jì)數(shù)據(jù)。如果指定了該選項(xiàng),那么將忽略 -u 選項(xiàng)。 -e:提取復(fù)制數(shù)據(jù)庫所需的 DDL 文件。該選項(xiàng)生成包含了 DDL 語句的腳本。該腳本可以在另一數(shù)據(jù)庫上運(yùn)行以重新創(chuàng)建數(shù)據(jù)庫對(duì)象。 -m:以模擬模式運(yùn)行 db2look 實(shí)用程序。該選項(xiàng)生成包含了 SQL UPDATE 語句的腳本。這些 SQL UPDATE 語句捕獲所有的統(tǒng)計(jì)數(shù)據(jù)。該腳本可以在另一數(shù)據(jù)庫上運(yùn)行以復(fù)制原來的那一個(gè)數(shù)據(jù)庫。當(dāng)指定 -m 選項(xiàng)時(shí),將忽略 -p、-g 和 -s 選項(xiàng)。 收集數(shù)據(jù)庫子集的統(tǒng)計(jì)數(shù)據(jù)和 DDL 為了僅僅收集某些表和相關(guān)對(duì)象的統(tǒng)計(jì)數(shù)據(jù)和 ddl,可使用下列命令: db2look -d <dbname> -e -a -m -t <table1> <table2> .. <tableX> -o table.ddl 這里,我使用了下列附加參數(shù): -t:為特定的表生成統(tǒng)計(jì)數(shù)據(jù)。可以將表的最大數(shù)目指定為 30。 此外,如果您不使用 -a 選項(xiàng),就可以使用 -z 選項(xiàng): -z:模式名。如果同時(shí)指定了 -z 和 -a,那么將忽略 -z。聯(lián)邦區(qū)域?qū)⒑雎阅J矫? 注意:-m 選項(xiàng)極其重要。該選項(xiàng)將從系統(tǒng)表收集所有統(tǒng)計(jì)數(shù)據(jù)。測試中的統(tǒng)計(jì)數(shù)據(jù)必須與生產(chǎn)中的相同,這些統(tǒng)計(jì)數(shù)據(jù)是可以在測試環(huán)境中模擬生產(chǎn)環(huán)境的關(guān)鍵。 db2exfmt 輸出的更多細(xì)節(jié) 數(shù)據(jù)庫管理器級(jí)的配置參數(shù) 注意:使用命令 db2 "get dbm cfg" 查看這些參數(shù),并使用 db2 "update dbm cfg using <parameter> <value>" 更新數(shù)據(jù)庫管理器的配置參數(shù)。 并行性(Parallelism): 該參數(shù)表明是啟用分區(qū)間并行性(inter-partition parallelism),還是啟用內(nèi)部分區(qū)并行性(intra-partition parallelism)。如果這是具有多個(gè)分區(qū)的 DPF,那么您將看到 Inter Partition Parallelism。如果這只是 SMP(啟用 intra_parallel)單個(gè)節(jié)點(diǎn)環(huán)境,那么您將看到 Intra Partition Parallelism。如果啟用了 intra_parallel,并且是多個(gè)分區(qū)的環(huán)境,您將看到該參數(shù)為 Inter and Intra partitions parallelism。最后,如果沒有分區(qū)間或分區(qū)內(nèi)并行性,該參數(shù)將顯示 NONE。 CPU 速度(cpuspeed): SQL 優(yōu)化器使用 CPU 速度(每條指令幾微秒)來評(píng)估某些操作的執(zhí)行成本。 通信速度(comm_bandwidth): SQL 優(yōu)化器使用為通信帶寬所指定的值(每秒幾兆字節(jié))來評(píng)估在分區(qū)數(shù)據(jù)庫系統(tǒng)中的分區(qū)服務(wù)器之間執(zhí)行某些操作的成本。 數(shù)據(jù)庫級(jí)的配置參數(shù) 注意:使用命令 db2 "get db cfg for <dbname>" 來查看這些參數(shù),以及使用 db2 "update db cfg for <dbname> using <parameter> <value>") 來更新數(shù)據(jù)庫配置參數(shù)。 緩沖池大小(buffer pool size): 如果使用 buffpage 作為一個(gè)緩沖池的默認(rèn)值,那么 db2exfmt 輸出中顯示的緩沖池大小就是由 buffpage 參數(shù)決定的,或者基于 syscat.bufferpools 的內(nèi)容進(jìn)行計(jì)算。所顯示的數(shù)目就是分配給數(shù)據(jù)庫的緩沖池頁面的總數(shù)目。例如,假設(shè)我們具有下列緩沖池: 表 1. 緩沖池設(shè)置 緩沖池名稱大小 IBMDEFAULTBP1000 BP11000 BP24000 BPIND11000 BPIND21000 BPLONG1000 BPTEMP1000 總數(shù):10,000 db2exfmt 輸出將顯示所有緩沖池中的頁面總數(shù)為總的大小。在上面的例子中,就是 10,000。 注意:頁面大小(Pagesize)無關(guān)緊要,僅僅是頁面的數(shù)目。 如果您無法在測試中分配到與生產(chǎn)中相同數(shù)量的緩沖池,那么可以在 db2look 中使用 -fd 選項(xiàng)來使用 db2fopt 備選命令。 在 MPP 中,優(yōu)化器為運(yùn)行查詢的節(jié)點(diǎn)使用總的緩沖池信息時(shí),要按每個(gè)節(jié)點(diǎn)來計(jì)算 opt_buffpage。因此,該修改將僅僅應(yīng)用到運(yùn)行該工具的那個(gè)節(jié)點(diǎn)上。 排序堆大小(SORTHEAP) 該參數(shù)定義用于私有排序的私有內(nèi)存頁面的最大數(shù)目,或用于共享排序的共享內(nèi)存頁面的最大數(shù)目。 您應(yīng)將之設(shè)置為與生產(chǎn)中相同的值。同樣,通過在 db2look 中使用 -fd 選項(xiàng),您將注意到: !db2fopt SAMPLE update opt_sortheap 256; 這將重寫 sortheap 配置參數(shù),優(yōu)化器也將之用作 sortheap 值。同樣,在運(yùn)行時(shí)真正分配的排序堆(sortheap)實(shí)際上將由數(shù)據(jù)庫配置中的 sortheap 設(shè)置來決定。與 opt_buffpage 相同,如果您無法在測試系統(tǒng)上分配與生產(chǎn)系統(tǒng)上相同大小的排序堆(sortheap),那么可以使用 opt_sortheap。 數(shù)據(jù)庫堆大小(DBHEAP): 每個(gè)數(shù)據(jù)庫都有一個(gè)數(shù)據(jù)庫堆,數(shù)據(jù)庫管理器使用它來代表連接到數(shù)據(jù)庫上的所有應(yīng)用程序。 它包含表、索引、表空間和緩沖池的控制塊信息。 鎖列表大小(LOCKLIST): 該參數(shù)表示分配給鎖列表的存儲(chǔ)器大小。 最大鎖列表(MAXLOCKS): 該參數(shù)定義數(shù)據(jù)庫管理器執(zhí)行升級(jí)之前必須填入的應(yīng)用程序所占有鎖列表的百分比。 locklist 和 maxlocks 將幫助確定某掃描(索引掃描或表掃描)期間將持有的鎖類型,以及隔離級(jí)別。例如,您將在計(jì)劃中注意到(比如說)索引掃描操作: IXSCAN: (Index Scan) TABLOCK : (Table Lock intent) INTENT SHARE 注意:如果測試系統(tǒng)的 db2exfmt 輸出中的可用鎖(Locks Available)與生產(chǎn)系統(tǒng)不同,就不要進(jìn)行連接 —— 該差異不影響查詢計(jì)劃。 平均應(yīng)用程序(AVG_APPLS): SQL 優(yōu)化器使用該參數(shù)來幫助評(píng)估在運(yùn)行時(shí)有多少緩沖池可用于所選擇的訪問計(jì)劃中(因?yàn)檫B接到數(shù)據(jù)庫的所有活動(dòng)應(yīng)用程序共享緩沖池)。 優(yōu)化級(jí)別(DFT_QUERYOPT): 查詢優(yōu)化類用于在編譯 SQL 查詢時(shí)指導(dǎo)優(yōu)化器使用不同的優(yōu)化級(jí)別。 查詢深度(DFT_DEGREE): 用于 SQL 語句的分區(qū)內(nèi)部并行程度。如果設(shè)置為 ANY,優(yōu)化器就對(duì)聯(lián)機(jī)的實(shí)際 CPU 數(shù)目敏感。如果您使用 ANY,那么就應(yīng)該將測試和生產(chǎn)系統(tǒng)上的 CPU 數(shù)目配置得相同,除非禁用分區(qū)內(nèi)并行(intra_parallel)。 除了以上修改之外,還必須確保其他一些參數(shù)都相同。 保留的高頻值數(shù)目(NUM_FREQVALUES): 該參數(shù)允許您指定“高頻值(most frequent values)”的數(shù)目,當(dāng)在 RUNSTATS 命令上指定 WITH DISTRIBUTION 選項(xiàng)時(shí),將收集該值。 保留的分位數(shù)數(shù)目(NUM_QUANTILES): 該參數(shù)控制在 RUNSTATS 命令上指定 WITH DISTRIBUTION 選項(xiàng)時(shí)將收集的分位數(shù)(quantile)數(shù)目。 測試系統(tǒng)上的上述兩個(gè)參數(shù) NUM_FREQVALUES 和 NUM_QUANTILES 必須與生產(chǎn)系統(tǒng)中的相同,以便確保在測試系統(tǒng)上收集與生產(chǎn)中相同數(shù)目的頻值數(shù)目和分位數(shù)值。 SQL 語句堆(4KB)(STMTHEAP): 在 SQL 語句的編譯期間,語句堆(statement heap)用作 SQL 編譯器的工作空間。該參數(shù)指定該工作空間的大小。如果測試中的該參數(shù)小于生產(chǎn)中的,您就可能會(huì)開始看到 SQL0101N 消息,因?yàn)槿狈幾g查詢所需要的語句堆空間。如果沒有足夠的語句堆用于動(dòng)態(tài)連接枚舉,您也可能看到 SQL0437W RC=1,下降為貪婪連接枚舉。 [page_break]在測試系統(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í),檢查注冊表變量設(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. [page_break]生成 db2exfmt 輸出: db2exfmt -d DUMMYDB -g TIC -w -1 -n % -s % -# 0 -o test_dummydb_exfmt.txt 檢查 test_dummydb_exfmt.txt 的內(nèi)容并查看訪問計(jì)劃: Access Plan: ----------- Total Cost: 25.8843 Query Degree: 1 Rows RETURN ( 1) Cost I/O | 4 MSJOIN ( 2) 25.8843 2 /-----+-----\ 1 4 TBSCAN TBSCAN ( 3) ( 5) 12.913 12.9682 1 1 | | 8 35 TABLE: SKAPOOR TABLE: SKAPOOR ORG STAFF 您在測試中獲得了一個(gè)不同于生產(chǎn)中的訪問計(jì)劃。本例中,顯然我們在測試系統(tǒng)上已經(jīng)將 DFT_QUERYOPT(默認(rèn)的查詢優(yōu)化)從 5 修改為 3。因此,您看到的是 Merge Join 計(jì)劃,而非 Hash Join 計(jì)劃,以及有一點(diǎn)點(diǎn)區(qū)別的總成本(Total Cost)。 因?yàn)檫@些計(jì)劃不匹配(假設(shè)您不確定為什么),所以要檢查 db2exfmt 輸出中的配置。見 表 2。 正如您可以看到的,測試(TEST)和生產(chǎn)(PRODUCTION)之間的惟一區(qū)別就是優(yōu)化級(jí)別(Optimization Level),我們特意將之從 5 修改為 3,只是為了顯示在測試環(huán)境中復(fù)制生產(chǎn)訪問計(jì)劃為何會(huì)不成功。 本例中,您將使用下列 UPDATE 語句將 DFT_QUERYOPT 更新為 5: UPDATE DB CFG FOR SAMPLE USING dft_queryopt 5 然后,停止并重新連接數(shù)據(jù)庫。再次對(duì) DUMMYDB 發(fā)出 query.sql,并使用 db2exfmt 命令生成訪問計(jì)劃。這次,您將看到相同的訪問計(jì)劃。否則,就進(jìn)一步確保本文中所討論的所有優(yōu)化器相關(guān)的參數(shù)都是相同的。 示例 2: 該示例顯示了 db2look 命令中 -m 選項(xiàng)的重要性。前面用 -m 選項(xiàng)收集的統(tǒng)計(jì)數(shù)據(jù)在測試和生產(chǎn)中應(yīng)該相同。本例中,我們將看到?jīng)]有正確更新統(tǒng)計(jì)數(shù)據(jù)時(shí)計(jì)劃是如何變化的。 數(shù)據(jù)庫管理器配置、數(shù)據(jù)庫配置和 db2set 注冊表變量與上面 示例 1 中的相同。這里的模式名是 SKAPOOR。用您的表的模式替換它。數(shù)據(jù)庫是相同的,與 示例 1 中一樣是 SAMPLE 和 DUMMY。這里所使用的平臺(tái)和 db2level 是 AIX 5.1 和 DB2 UDB ESE V8.2,F(xiàn)ix pack 8,單分區(qū)。 在 sample 數(shù)據(jù)庫上執(zhí)行下列命令: db2 "connect to sample" db2 "create index name_ind on staff (name,id)" db2 "runstats on table skapoor.staff with distribution and indexes all" db2 "set current explain mode explain" db2 "select name from staff where id=10 order by name" db2 "set current explain mode no" db2 "terminate" 使用 db2exfmt 生成訪問計(jì)劃。您將看到下面的訪問計(jì)劃: Access Plan: ----------- Total Cost: 0.111065 Query Degree: 1 Rows RETURN ( 1) Cost I/O | 1 IXSCAN ( 2) 0.111065 0 | 35 INDEX: SKAPOOR NAME_IND 從 sample 數(shù)據(jù)庫中收集 db2look 信息: db2look -d sample -l -o storage.out db2look -d sample -e -a -m -t STAFF -o db2look.out db2look -d sample -f -fd -o config.out 修改這些文件以使您連接 dummy 數(shù)據(jù)庫,而非之前在上面 示例 1 中所連接的 sample 數(shù)據(jù)庫。 手工修改統(tǒng)計(jì)數(shù)據(jù)之一。在 db2look.out 文件中搜索下列語句(請注意,模式名、TABSCHEMA 和 INDSCHEMA 可能與您的具體情況不同): UPDATE SYSSTAT.INDEXES SET NLEAF=1, NLEVELS=1, FIRSTKEYCARD=35, FIRST2KEYCARD=35, FIRST3KEYCARD=-1, FIRST4KEYCARD=-1, FULLKEYCARD=35, CLUSTERFACTOR=-1.000000, CLUSTERRATIO=100, SEQUENTIAL_PAGES=0, DENSITY=0, AVERAGE_SEQUENCE_GAP=0.000000, AVERAGE_SEQUENCE_FETCH_GAP=0.000000, AVERAGE_SEQUENCE_PAGES=0.000000, AVERAGE_SEQUENCE_FETCH_PAGES=0.000000, AVERAGE_RANDOM_PAGES=1.000000, AVERAGE_RANDOM_FETCH_PAGES=0.000000, NUMRIDS=35, NUMRIDS_DELETED=0, NUM_EMPTY_LEAFS=0 WHERE INDNAME = ’NAME_IND’ AND INDSCHEMA = ’SKAPOOR ’ AND TABNAME = ’STAFF’ AND TABSCHEMA = ’SKAPOOR ’; 現(xiàn)在,將 FIRSTKEYCARD、FIRST2KEYCARD、FULLKEYCARD 和 NUMRIDS 從 35 修改為 37。現(xiàn)在保存 db2look.out 文件并運(yùn)行這 3 個(gè)文件: db2 -tvf config.out > config_output.out db2 -tvf storage.out > storage_output.out db2 terminate db2stop db2start db2 -tvf db2look.out > db2look_output.out 檢查前兩個(gè)文件 config_output.out 和 storage_output.out 的內(nèi)容,以確保它們運(yùn)行成功。現(xiàn)在,檢查 db2look_output.out 文件的內(nèi)容。您將看到下列更新語句失敗了: UPDATE SYSSTAT.INDEXES SET NLEAF=1, NLEVELS=1, FIRSTKEYCARD=37, FIRST2KEYCARD=37 , FIRST3KEYCARD=-1, FIRST4KEYCARD=-1, FULLKEYCARD=37, CLUSTERFACTOR=-1.000000, C LUSTERRATIO=100, SEQUENTIAL_PAGES=0, DENSITY=0, AVERAGE_SEQUENCE_GAP=0.000000, A VERAGE_SEQUENCE_FETCH_GAP=0.000000, AVERAGE_SEQUENCE_PAGES=0.000000, AVERAGE_SEQ UENCE_FETCH_PAGES=0.000000, AVERAGE_RANDOM_PAGES=1.000000, AVERAGE_RANDOM_FETCH_ PAGES=0.000000, NUMRIDS=37, NUMRIDS_DELETED=0, NUM_EMPTY_LEAFS=0 WHERE INDNAME = ’NAME_IND’ AND INDSCHEMA = ’SKAPOOR ’ AND TABNAME = ’STAFF’ AND TABSCHEMA = ’SK APOOR ’ DB21034E The command was processed as an SQL statement because it was not a valid Command Line Processor command. During SQL processing it returned: SQL1227N The catalog statistic "37" for column "FULLKEYCARD" is out of range for its target column, has an invalid format, or is inconsistent in relation to some other statistic. Reason Code = "8". SQLSTATE=23521 正如您可以看到的,上面用于索引 NAME_IND 的 UPDATE 語句失敗了,因?yàn)?nbsp;FULLKEYCARD 大于表的基數(shù)(CARD)。正如通過 db2look.out 文件中的下列更新語句可以看到的,CARD 是 35: UPDATE SYSSTAT.TABLES SET CARD=35, NPAGES=1, FPAGES=1, OVERFLOW=0, ACTIVE_BLOCKS=0 WHERE TABNAME = ’STAFF’ AND TABSCHEMA = ’SKAPOOR ’; 現(xiàn)在,再次以解釋模式運(yùn)行相同的查詢: db2 "select name from staff where id=10 order by name" 并生成訪問計(jì)劃。您將看到它是不同的: Access Plan: ----------- Total Cost: 12.972 Query Degree: 1 Rows RETURN ( 1) Cost I/O | 1 TBSCAN ( 2) 12.972 1 | 1 SORT ( 3) 12.9708 1 | 1 TBSCAN ( 4) 12.9682 1 | 35 TABLE: SKAPOOR STAFF 該示例顯示,如果在表上發(fā)生 WRITE 活動(dòng)時(shí)運(yùn)行 RUNSTATS,統(tǒng)計(jì)數(shù)據(jù)就可能與本示例中的不一致。因此,用于更新統(tǒng)計(jì)數(shù)據(jù)的 UPDATE 語句可能失敗并產(chǎn)生 SQL1227N 錯(cuò)誤消息。所有的 UPDATE 語句都運(yùn)行成功十分重要,如果存在不一致性,就應(yīng)該進(jìn)行修理并重新運(yùn)行。本例中,解決方案是將 KEYCARDS 和 NUMRIDS 從 37 重新修改為 35。 [page_break]示例 3: 您需要在單分區(qū)的環(huán)境中模擬生產(chǎn)中的整個(gè)數(shù)據(jù)庫以進(jìn)行測試。 注意:如果測試中的數(shù)據(jù)庫名與生產(chǎn)中的不同,那么可能需要修改每個(gè) db2look 輸出中的數(shù)據(jù)庫名。 步驟 1:使用 -l 選項(xiàng)收集 db2look,以收集表空間/緩沖池/數(shù)據(jù)庫節(jié)點(diǎn)組信息。 db2look -d <dbname> -l -o storage.out 修改表空間信息以適應(yīng)您的測試環(huán)境。例如,在生產(chǎn)中,您具有下列表空間: ------------------------------------ -- DDL Statements for TABLESPACES -- ------------------------------------ CREATE REGULAR TABLESPACE DMS1 IN DATABASE PARTITION GROUP IBMDEFAULTGROUP PAGESIZE 4096 MANAGED BY DATABASE USING ( FILE ’/data/dms1’20000, FILE ’/data/dms2’20000, FILE ’/data/dms3’20000) EXTENTSIZE 32 PREFETCHSIZE 32 BUFFERPOOL IBMDEFAULTBP OVERHEAD 12.670000 TRANSFERRATE 0.180000 DROPPED TABLE RECOVERY ON; 如果測試上沒有設(shè)置相同的路徑,那么就要修改上面的位置。如果您僅僅計(jì)劃模擬環(huán)境,而不要復(fù)制整個(gè)數(shù)據(jù),那么就減小文件的大小,并在必要時(shí)使用較少容器。如果沒有創(chuàng)建相同的緩沖池,那么您還可能修改緩沖池名稱。緩沖池必須具有相同的頁面大小(pagesize)。不要修改表空間的頁面大小。一旦處理了這些并創(chuàng)建了數(shù)據(jù)庫,就運(yùn)行 storage.out 文件: db2 -tvf storage.out 如果需要,就重新定向輸出以確保都成功運(yùn)行了。例如: db2 -tvf storage.out > storage_results.out 步驟 2:從生產(chǎn)中收集配置和環(huán)境變量信息,并在測試系統(tǒng)上運(yùn)行它: db2look -d sample -f -fd -o config.out 請記住,在 MPP 環(huán)境中,這將為運(yùn)行該命令的節(jié)點(diǎn)收集該信息。如果不同的數(shù)據(jù)庫分區(qū)上的 DB2 注冊表和數(shù)據(jù)庫以及數(shù)據(jù)庫管理器配置不同,您將需要為每個(gè)節(jié)點(diǎn)分別收集該信息。然而,如果測試中無法具有與生產(chǎn)中相同的分區(qū),那么就從生產(chǎn)中執(zhí)行該查詢的節(jié)點(diǎn)中收集該信息,然后在測試中使用該信息。 請注意,如果測試中具有不同的分區(qū)數(shù)目,那么您的模擬將有所欠缺。 在測試系統(tǒng)上,運(yùn)行 config.out 文件,如下: db2 -tvf config.out 上面考慮到優(yōu)化器將使用 db2fopt 信息來查看所分配的總的緩沖池和排序堆,現(xiàn)在將成為測試環(huán)境中的設(shè)置。而且,這也是在測試中由于內(nèi)存約束而不具有與生產(chǎn)中相同的緩沖池以及排序堆時(shí)所使用的技術(shù)。同時(shí),本文前面所討論的配置參數(shù)以及環(huán)境變量也將進(jìn)行更新。 步驟 3:當(dāng)模擬整個(gè)數(shù)據(jù)庫時(shí),從生產(chǎn)中收集所有對(duì)象的 DDL 信息,并在測試中運(yùn)行 db2look。 在生產(chǎn)中: db2look -d sample -e -a -m -o db2look.out 在測試中: db2 -tvf db2look.out 為了看到輸出結(jié)果,可發(fā)出: db2look -tvf db2look.out > db2look.results 一旦完成了以上步驟,就請確保在測試中將 dbheap 數(shù)據(jù)庫配置參數(shù)設(shè)置為與生產(chǎn)中相同的值。 步驟 4:使用 db2exfmt 從測試和生產(chǎn)中獲得訪問計(jì)劃,并確保下列內(nèi)容與生產(chǎn)中的相同: Database Context: ---------------- Parallelism: None CPU Speed: 4.762804e-07 Comm Speed: 100 Buffer Pool size: 128500 Sort Heap size: 128 Database Heap size: 5120 Lock List size: 12250 Maximum Lock List: 10 Average Applications: 4 Locks Available: 78400 Package Context: --------------- SQL Type: Dynamic Optimization Level: 3 Blocking: Block All Cursors Isolation Level: Cursor Stability ---------------- STATEMENT 1 SECTION 201 ---------------- QUERYNO: 1 QUERYTAG: CLP Statement Type: Select Updatable: No Deletable: No Query Degree: 1 現(xiàn)在,查看訪問計(jì)劃。如果它們是相同的,那么您就成功地重新創(chuàng)建了訪問計(jì)劃。還請注意,您還應(yīng)查看 db2exfmt 輸出結(jié)尾以驗(yàn)證表空間配置是匹配的。 示例 4: 生產(chǎn):MPP,4 個(gè)邏輯分區(qū)/ 16 個(gè)物理分區(qū)。 測試:MPP,4 個(gè)邏輯分區(qū),每個(gè)邏輯分區(qū)中只有 4 臺(tái)可用的物理機(jī)器。 查詢中所涉及的表、視圖/MQT。 本示例中,該模擬可能不會(huì)準(zhǔn)確工作。測試和生產(chǎn)中的分區(qū)數(shù)目必須相同。然而,您仍可以嘗試重新創(chuàng)建,只是它不會(huì)正確。 因此,您必須向測試環(huán)境添加 16*4=64 個(gè)分區(qū),以便重新創(chuàng)建正確。測試環(huán)境中不需要 16 臺(tái)物理機(jī)器;即您可以具有 4 臺(tái)物理機(jī)器,每臺(tái)物理機(jī)器具有 16 個(gè)邏輯分區(qū)。這由您來決定,但總共必須有 64 個(gè)邏輯分區(qū),與生產(chǎn)中相同。 因此現(xiàn)在在進(jìn)行修改向測試環(huán)境添加相同數(shù)目的邏輯分區(qū)之后,測試環(huán)境看上去將像原始的生產(chǎn)設(shè)置了,如下表所示。 表 3. 生產(chǎn)設(shè)置 數(shù)據(jù)庫分區(qū)(DBPARTITION) ALLNODES(在節(jié)點(diǎn) 1 到 64 上) NODE1(節(jié)點(diǎn) 1 上所定義的 db 分區(qū)) NODE2(節(jié)點(diǎn) 5 上所定義的 db 分區(qū)) 表空間(TABLESPACE) TABSPACE1(DMS 使用數(shù)據(jù)庫分區(qū) ALLNODES 中定義的設(shè)備) TABSPACE2(DMS 使用數(shù)據(jù)庫分區(qū) NODE1 中定義的 SMS) TABSPACE3(DMS 使用數(shù)據(jù)庫分區(qū) NODE2 中定義的 DMS) 表 TABSPACE1 中的 TAB1 TABSPACE2 中的 TAB2 TABSPACE3 中的 TAB3 MQT: TAB3 上定義的 MQT 視圖: 定義的 VIEW1,包含兩個(gè)表 TAB1 和 TAB2 請確保在發(fā)出查詢的節(jié)點(diǎn)上使用 -f 和 -fd 收集 db2look,以確保從該節(jié)點(diǎn)和注冊表設(shè)置中獲取前面所討論的緩沖池信息,以及從運(yùn)行查詢的節(jié)點(diǎn)獲取 db cfg 和 dbm cfg。以我的經(jīng)驗(yàn),客戶的所有節(jié)點(diǎn)通常具有相同的配置,除了緩沖池這個(gè)極其重要的設(shè)置之外。 所遵循的步驟: 步驟 1:從生產(chǎn)中收集存儲(chǔ)器信息: db2look -d <dbname> -l -o storage.out 步驟 2:修改表空間/緩沖池信息以適應(yīng)這些環(huán)境。如果您沒有可用的設(shè)備,那么就使用 DMS 文件容器。同樣,如果您不希望在測試中使用與生產(chǎn)中相同數(shù)目的容器,就縮短列表并使用較少容器。但是,您同樣必須確保如果生產(chǎn)中的表空間是 DMS 或 SMS 類型的,那么在測試中要保留相同的類型。 步驟 3:使用下列命令收集配置信息: db2look -d <dbname> -f -fd -o config.out 步驟 4:現(xiàn)在,僅僅為我們感興趣的對(duì)象收集 db2look 信息。本例中,我們需要所有相關(guān)信息,包括表 DLL、視圖以與表相關(guān)的 MQT: db2look -d <dbname> -e -a -m -t TAB1 TAB2 TAB3 -o db2look.out 一旦收集了所有這些信息并修改了表空間/緩沖池信息,就在測試環(huán)境中執(zhí)行 db2look 輸出文件,并且重新從生產(chǎn)和測試中獲取 db2exfmt 輸出并進(jìn)行比較。 示例 5: 這是一關(guān)于在表上進(jìn)行活動(dòng)時(shí)在哪里收集 RUNSTATS 信息的經(jīng)典示例。您將獲得 SQL1227N 錯(cuò)誤消息,并且將無法重新創(chuàng)建該問題,除非手工修改統(tǒng)計(jì)數(shù)據(jù)。 例如,該表具有一百萬行記錄,一個(gè)整型列上定義了主鍵。您運(yùn)行帶有分布和索引所有選項(xiàng)的 RUNSTATS,從而允許對(duì)表進(jìn)行寫訪問。在獲得表統(tǒng)計(jì)數(shù)據(jù)的時(shí)候,有 100,000 條附加記錄插入了該表。因此對(duì)于表統(tǒng)計(jì)數(shù)據(jù),CARD 將顯示為 1,100,000。但是,在我們開始收集索引統(tǒng)計(jì)數(shù)據(jù)時(shí),例如,對(duì)于整型列上所定義的主鍵,就插入了 10,000 條附加記錄,因此,該表中的行數(shù)是 1,110,000,而主索引 FIRSTKEYCARD 將是 1,110,000。因此,您可以看到不一致性。表統(tǒng)計(jì)數(shù)據(jù)的 CARD 顯示表中應(yīng)該是 1,100,000 條記錄,而主索引統(tǒng)計(jì)數(shù)據(jù)的 FIRSTKEYCARD 顯示表中應(yīng)該是 1,110,000 條記錄。對(duì)于索引統(tǒng)計(jì)數(shù)據(jù)的更新將失敗,并發(fā)出 SQL1227N rc=8 錯(cuò)誤消息(本例中),因?yàn)樗饕?nbsp;FIRSTKEYCARD 大于表的 CARD。您必須手工修復(fù)這種不一致性,對(duì)于本例,就是使 FIRSTKEYCARD 等于 CARD,均等于 1,100,000,或者反過來 —— 即增加 CARD 到等于 FIRSTKEYCARD,均等于 1,110,000。 您還可能碰到許多其他的不一致性。請確保在將輸出保存為文件的測試中運(yùn)行帶有 -m 選項(xiàng)的 db2look 時(shí),檢查所有的不一致性,并進(jìn)行修復(fù)。這里僅僅給出了一個(gè)不一致性的例子;您可能會(huì)碰到很多其他的不一致性,這將留給用戶去修復(fù)所有這些不一致性,然后重新運(yùn)行 db2look,將輸出重定向到文件中以確保所有更新的統(tǒng)計(jì)數(shù)據(jù)都運(yùn)行得很好,沒有任何問題。 示例 6: 在該示例中,您在生產(chǎn)中獲得 SQL0437W rc=1 警告消息,但在測試中沒有看到它。本例中,按照上面的示例重新創(chuàng)建該問題。請確保 STMTHEAP 是相同的。如果它是不同的(例如出于某種原因,測試中高于生產(chǎn)中),那么您可能就不會(huì)看到相同的警告。同樣,我們所討論的其他參數(shù)也很重要。 SQL0437W rc=2 和其他返回代碼也可以按照相同的方法重新進(jìn)行創(chuàng)建。 其他錯(cuò)誤消息,例如 SQL0101N 和 SQL0901N 也可以使用相同的方法重新進(jìn)行創(chuàng)建。甚至可以重新創(chuàng)建編譯器/優(yōu)化器領(lǐng)域中的中斷。當(dāng)您處于更老的補(bǔ)丁包級(jí)別,并需要嘗試最新補(bǔ)丁包級(jí)別以查看是否可以避免該問題時(shí),或者當(dāng)您需要嘗試不同的優(yōu)化級(jí)別以查看是否將暫時(shí)克服該問題時(shí),這就極其有用。 結(jié)束語 db2look 是一個(gè)功能極其強(qiáng)大的實(shí)用程序,可以用于重新創(chuàng)建訪問計(jì)劃問題以及編譯器問題,如本文中所討論的那些。一旦重新創(chuàng)建了該問題,您就可以測試許多可以影響性能的變量,如修改優(yōu)化級(jí)別,嘗試注冊表變量和更新不影響生產(chǎn)的統(tǒng)計(jì)數(shù)據(jù),以及測試新的補(bǔ)丁包級(jí)別。您將發(fā)現(xiàn)這個(gè)方便的實(shí)用程序可用于調(diào)試問題和提高查詢性能。 全新的路由器不僅讓你更穩(wěn)定快速地連接無線網(wǎng)絡(luò),更可以讓家中的智能設(shè)備連接在一起。 |
溫馨提示:喜歡本站的話,請收藏一下本站!