正如將在下面的 排序堆 一節(jié)中所看到的,它的工作方式與排序堆的相同。
如果您是一名 DBA,就可能會使用 DB2 SQL Explain Tool(db2exfmt)來獲得對于 SQL 訪問計劃的理解。db2exfmt 工具用于格式化解釋表的內(nèi)容。如果您在生產(chǎn)中使用 db2exfmt 查看一個訪問計劃的輸出,就會注意到計劃頂部的下列內(nèi)容。(注意:這些參數(shù)通常是由 db2look 輸出中的 -f 和 -fd 選項所選擇的,除了 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 的輸出,就在訪問計劃之后,您將看到是否具有影響優(yōu)化器計劃的注冊表設(shè)置。
注意:另外,遺憾的是,db2look -f 并非列出了所有相關(guān)的注冊表變量。您將需要添加那些遺漏的。一般來說,您測試系統(tǒng)上的注冊表變量設(shè)置應(yīng)與生產(chǎn)系統(tǒng)上的相同,或者盡可能接近。
清單 4. 影響訪問計劃的注冊表設(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ù)庫對象,以及配置和統(tǒng)計信息。
db2look -d <dbname> -e -a -m -o db2look.out
這里,我們使用了下列參數(shù):
-a:為所有的創(chuàng)建器(creator)生成統(tǒng)計數(shù)據(jù)。如果指定了該選項,那么將忽略 -u 選項。
-e:提取復(fù)制數(shù)據(jù)庫所需的 DDL 文件。該選項生成包含了 DDL 語句的腳本。該腳本可以在另一數(shù)據(jù)庫上運(yùn)行以重新創(chuàng)建數(shù)據(jù)庫對象。
-m:以模擬模式運(yùn)行 db2look 實用程序。該選項生成包含了 SQL UPDATE 語句的腳本。這些 SQL UPDATE 語句捕獲所有的統(tǒng)計數(shù)據(jù)。該腳本可以在另一數(shù)據(jù)庫上運(yùn)行以復(fù)制原來的那一個數(shù)據(jù)庫。當(dāng)指定 -m 選項時,將忽略 -p、-g 和 -s 選項。
收集數(shù)據(jù)庫子集的統(tǒng)計數(shù)據(jù)和 DDL
為了僅僅收集某些表和相關(guān)對象的統(tǒng)計數(shù)據(jù)和 ddl,可使用下列命令:
db2look -d <dbname> -e -a -m -t <table1> <table2> .. <tableX> -o table.ddl
這里,我使用了下列附加參數(shù):
-t:為特定的表生成統(tǒng)計數(shù)據(jù)??梢詫⒈淼淖畲髷?shù)目指定為 30。
此外,如果您不使用 -a 選項,就可以使用 -z 選項:
-z:模式名。如果同時指定了 -z 和 -a,那么將忽略 -z。聯(lián)邦區(qū)域?qū)⒑雎阅J矫?nbsp;
注意:-m 選項極其重要。該選項將從系統(tǒng)表收集所有統(tǒng)計數(shù)據(jù)。測試中的統(tǒng)計數(shù)據(jù)必須與生產(chǎn)中的相同,這些統(tǒng)計數(shù)據(jù)是可以在測試環(huán)境中模擬生產(chǎn)環(huán)境的關(guān)鍵。
db2exfmt 輸出的更多細(xì)節(jié)
數(shù)據(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)。如果這是具有多個分區(qū)的 DPF,那么您將看到 Inter Partition Parallelism。如果這只是 SMP(啟用 intra_parallel)單個節(jié)點環(huán)境,那么您將看到 Intra Partition Parallelism。如果啟用了 intra_parallel,并且是多個分區(qū)的環(huán)境,您將看到該參數(shù)為 Inter and Intra partitions parallelism。最后,如果沒有分區(qū)間或分區(qū)內(nèi)并行性,該參數(shù)將顯示 NONE。
CPU 速度(cpuspeed):
SQL 優(yōu)化器使用 CPU 速度(每條指令幾微秒)來評估某些操作的執(zhí)行成本。
通信速度(comm_bandwidth):
SQL 優(yōu)化器使用為通信帶寬所指定的值(每秒幾兆字節(jié))來評估在分區(qū)數(shù)據(jù)庫系統(tǒng)中的分區(qū)服務(wù)器之間執(zhí)行某些操作的成本。
數(shù)據(jù)庫級的配置參數(shù)
注意:使用命令 db2 "get db cfg for <dbname>" 來查看這些參數(shù),以及使用 db2 "update db cfg for <dbname> using <parameter> <value>") 來更新數(shù)據(jù)庫配置參數(shù)。
緩沖池大?。╞uffer pool size):
如果使用 buffpage 作為一個緩沖池的默認(rèn)值,那么 db2exfmt 輸出中顯示的緩沖池大小就是由 buffpage 參數(shù)決定的,或者基于 syscat.bufferpools 的內(nèi)容進(jìn)行計算。所顯示的數(shù)目就是分配給數(shù)據(jù)庫的緩沖池頁面的總數(shù)目。例如,假設(shè)我們具有下列緩沖池:
表 1. 緩沖池設(shè)置
緩沖池名稱大小
IBMDEFAULTBP1000
BP11000
BP24000
BPIND11000
BPIND21000
BPLONG1000
BPTEMP1000
總數(shù):10,000
db2exfmt 輸出將顯示所有緩沖池中的頁面總數(shù)為總的大小。在上面的例子中,就是 10,000。 注意:頁面大?。≒agesize)無關(guān)緊要,僅僅是頁面的數(shù)目。
如果您無法在測試中分配到與生產(chǎn)中相同數(shù)量的緩沖池,那么可以在 db2look 中使用 -fd 選項來使用 db2fopt 備選命令。
在 MPP 中,優(yōu)化器為運(yùn)行查詢的節(jié)點使用總的緩沖池信息時,要按每個節(jié)點來計算 opt_buffpage。因此,該修改將僅僅應(yīng)用到運(yùn)行該工具的那個節(jié)點上。
排序堆大?。⊿ORTHEAP)
該參數(shù)定義用于私有排序的私有內(nèi)存頁面的最大數(shù)目,或用于共享排序的共享內(nèi)存頁面的最大數(shù)目。
您應(yīng)將之設(shè)置為與生產(chǎn)中相同的值。同樣,通過在 db2look 中使用 -fd 選項,您將注意到:
!db2fopt SAMPLE update opt_sortheap 256;
這將重寫 sortheap 配置參數(shù),優(yōu)化器也將之用作 sortheap 值。同樣,在運(yùn)行時真正分配的排序堆(sortheap)實際上將由數(shù)據(jù)庫配置中的 sortheap 設(shè)置來決定。與 opt_buffpage 相同,如果您無法在測試系統(tǒng)上分配與生產(chǎn)系統(tǒng)上相同大小的排序堆(sortheap),那么可以使用 opt_sortheap。
數(shù)據(jù)庫堆大?。―BHEAP):
每個數(shù)據(jù)庫都有一個數(shù)據(jù)庫堆,數(shù)據(jù)庫管理器使用它來代表連接到數(shù)據(jù)庫上的所有應(yīng)用程序。 它包含表、索引、表空間和緩沖池的控制塊信息。
鎖列表大?。↙OCKLIST):
該參數(shù)表示分配給鎖列表的存儲器大小。
最大鎖列表(MAXLOCKS):
該參數(shù)定義數(shù)據(jù)庫管理器執(zhí)行升級之前必須填入的應(yīng)用程序所占有鎖列表的百分比。
locklist 和 maxlocks 將幫助確定某掃描(索引掃描或表掃描)期間將持有的鎖類型,以及隔離級別。例如,您將在計劃中注意到(比如說)索引掃描操作:
IXSCAN: (Index Scan)
TABLOCK : (Table Lock intent)
INTENT SHARE
注意:如果測試系統(tǒng)的 db2exfmt 輸出中的可用鎖(Locks Available)與生產(chǎn)系統(tǒng)不同,就不要進(jìn)行連接 —— 該差異不影響查詢計劃。
平均應(yīng)用程序(AVG_APPLS):
SQL 優(yōu)化器使用該參數(shù)來幫助評估在運(yùn)行時有多少緩沖池可用于所選擇的訪問計劃中(因為連接到數(shù)據(jù)庫的所有活動應(yīng)用程序共享緩沖池)。
優(yōu)化級別(DFT_QUERYOPT):
查詢優(yōu)化類用于在編譯 SQL 查詢時指導(dǎo)優(yōu)化器使用不同的優(yōu)化級別。
查詢深度(DFT_DEGREE):
用于 SQL 語句的分區(qū)內(nèi)部并行程度。如果設(shè)置為 ANY,優(yōu)化器就對聯(lián)機(jī)的實際 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 選項時,將收集該值。
保留的分位數(shù)數(shù)目(NUM_QUANTILES):
該參數(shù)控制在 RUNSTATS 命令上指定 WITH DISTRIBUTION 選項時將收集的分位數(shù)(quantile)數(shù)目。
測試系統(tǒng)上的上述兩個參數(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)中的,您就可能會開始看到 SQL0101N 消息,因為缺乏編譯查詢所需要的語句堆空間。如果沒有足夠的語句堆用于動態(tài)連接枚舉,您也可能看到 SQL0437W RC=1,下降為貪婪連接枚舉。