RUNSTATS 是 DB2® Universal Database™(DB2 UDB)中的實(shí)用程序,它更新優(yōu)化器為確定存取數(shù)據(jù)的最快路徑所使用的目錄統(tǒng)計(jì)信息。DB2 UDB V8.2 中,增加了相當(dāng)多的 RUNSTATS 選項(xiàng)。理解如何使用 RUNSTATS 的現(xiàn)有選項(xiàng)和新選項(xiàng)可以幫助您獲得最佳的數(shù)據(jù)庫性能。
RUNSTATS 為什么很重要?
現(xiàn)在,幾乎所有重要數(shù)據(jù)庫都使用某種方法來更新目錄統(tǒng)計(jì)信息,以便為其優(yōu)化器提供可能的最佳信息。可以將優(yōu)化器視為一個(gè)勘探器,正在系統(tǒng)中的數(shù)據(jù)所代表的大山中進(jìn)行定位。目錄統(tǒng)計(jì)信息的更新將為優(yōu)化器提供最新的地圖,以便在整個(gè)地形中快速定位。
DB2 優(yōu)化器使用目錄統(tǒng)計(jì)信息來確定最佳的訪問路徑,而更新這些目錄統(tǒng)計(jì)信息所采用的主要方法就是運(yùn)行 RUNSTATS 實(shí)用程序。當(dāng)用戶表中發(fā)生數(shù)據(jù)修改時(shí),目錄統(tǒng)計(jì)信息表不會(huì)自動(dòng)被修改。必須在表和索引上執(zhí)行 RUNSTATS 命令,用最新的信息更新目錄表中的列。
可以查詢下列目錄列,確定是否在表和索引上執(zhí)行了 RUNSTATS:
- 如果對(duì)于某個(gè)表,SYSCAT.TABLES 視圖的 CARD 列顯示的值為 -1,或者 STATS_TIME 列顯示的值為 NULL,那么這表示沒有對(duì)該表運(yùn)行 RUNSTATS 實(shí)用程序。
- 如果對(duì)于某個(gè)索引,SYSCAT.INDEXES 視圖的 NLEAF、NLEVELS 和 FULLKEYCARD 列顯示的值為 -1,或者 STATS_TIME 列顯示的值為 NULL,那么這表示沒有對(duì)該索引運(yùn)行 RUNSTATS 實(shí)用程序。
在第一次將數(shù)據(jù)載入到表中之后,就無法避免地要對(duì)表進(jìn)行更新、刪除和插入等形式的修改。可以添加或刪除索引。特定列中的數(shù)據(jù)分布可能隨時(shí)間發(fā)生改變。目錄中不會(huì)反映這些修改,除非在這些表和索引上執(zhí)行 RUNSTATS。一段時(shí)間之后,隨著表和數(shù)據(jù)發(fā)生更改,目錄統(tǒng)計(jì)信息可能會(huì)過時(shí)。
執(zhí)行 RUNSTATS 是很重要的,但是頻繁地運(yùn)行可能會(huì)帶來問題。對(duì)于較小的表,發(fā)出 RUNSTATS 命令將是一項(xiàng)普通任務(wù)。然而,隨著表的增長,完成 RUNSTATS 命令將占用更多時(shí)間、CPU 和內(nèi)存資源。最終,您必須考慮分配更多時(shí)間和資源來運(yùn)行 RUNSTATS 與不執(zhí)行該命令的潛在性能下降之間的平衡。通常只在關(guān)鍵查詢的速度開始減慢時(shí),管理員才會(huì)對(duì) RUNSTATS 給予適當(dāng)?shù)淖⒁狻D梢酝ㄟ^制定高效、有效收集統(tǒng)計(jì)信息的策略,避免未經(jīng)思考就調(diào)優(yōu)查詢和執(zhí)行 RUNSTATS。
使用 RUNSTATS 收集目錄統(tǒng)計(jì)信息
理論上,應(yīng)該在下列情況下對(duì)表和索引執(zhí)行 RUNSTATS:
- 將數(shù)據(jù)載入表中并創(chuàng)建了合適的索引之后。不過,最好是在創(chuàng)建索引之后再執(zhí)行 LOAD 命令,并在 LOAD 期間收集統(tǒng)計(jì)信息。
- 創(chuàng)建了一個(gè)新的索引之后。
- 使用 REORG 實(shí)用程序重新組織表之后。
- 通過數(shù)據(jù)更新、刪除和插入大量更新表及其索引之后。
- 更改了預(yù)取(prefetch)大小之后。
- 運(yùn)行 REDISTRIBUTE DATABASE PARTITION GROUP 實(shí)用程序之后。
您可以通過比較查詢 RUNSTATS 之前和之后的 EXPLAIN 輸出,來確定運(yùn)行 RUNSTATS 對(duì)于訪問計(jì)劃的影響。
完成每一條 RUNSTATS 語句之后,您都應(yīng)該執(zhí)行顯式的 COMMIT WORK。COMMIT 將釋放鎖,并避免在收集多個(gè)表的統(tǒng)計(jì)信息時(shí)填寫日志。
在用 RUNSTATS 收集了統(tǒng)計(jì)信息之后,要使用 BIND 命令或 REBIND 命令重新綁定包含了靜態(tài) SQL 的包(并可以選擇重新解釋其語句)。 db2rbind
命令可用于重新綁定數(shù)據(jù)庫中的所有包。使用 FLUSH PACKAGE 命令來刪除包緩存器中當(dāng)前所有緩存的動(dòng)態(tài) SQL 語句,并強(qiáng)制隱式地編譯下一請(qǐng)求。
注意:在 RUNSTATS 語法中,必須使用全限定的表名 schema.table-name
和全限定的索引名 schema.index-name
。您可以在所有列上,或者僅僅在某些列或列組(除了 LONG 和 LOB 列)上執(zhí)行 RUNSTATS。如果沒有指定特定列的子句,系統(tǒng)則會(huì)使用默認(rèn)的 ON ALL COLUMNS 子句。
使用 RUNSTATS WITH DISTRIBUTION
當(dāng)您已確定表中包含不是統(tǒng)一分布的數(shù)據(jù)時(shí),可以運(yùn)行包含 WITH DISTRIBUTION 子句的 RUNSTATS。目錄統(tǒng)計(jì)信息表通常包含關(guān)于表中最高和最低值的信息,而優(yōu)化器假定數(shù)據(jù)值是在兩個(gè)端點(diǎn)值之間均勻分布的。然而,如果數(shù)據(jù)值彼此之間差異較大,或者群集在某些點(diǎn)上,或者是碰到許多重復(fù)的數(shù)據(jù)值,那么優(yōu)化器就無法選擇一個(gè)最佳的訪問路徑,除非收集了分布統(tǒng)計(jì)信息。使用 WITH DISTRIBUTION 子句還可以幫助查詢處理沒有參數(shù)標(biāo)志符(parameter marker)或主機(jī)變量的謂詞,因?yàn)閮?yōu)化器仍然不知道運(yùn)行時(shí)的值是有許多行,還是只有少數(shù)行。
包含頻率和分位數(shù)統(tǒng)計(jì)信息的 RUNSTATS
在執(zhí)行包含 WITH DISTRIBUTION 子句的 RUNSTATS 時(shí),會(huì)根據(jù) RUNSTATS 命令中給定的選項(xiàng)選擇一組頻率(frequency)和分位數(shù)(quantile)的統(tǒng)計(jì)信息。
RUNSTATS 收集兩種類型的數(shù)據(jù)分布統(tǒng)計(jì)信息:頻率統(tǒng)計(jì)信息和分位數(shù)統(tǒng)計(jì)信息。
頻率統(tǒng)計(jì)信息的默認(rèn)值由 num_freqvalues 數(shù)據(jù)庫配置參數(shù)控制,該值提供了重復(fù)最多的列和數(shù)據(jù)值的信息。其默認(rèn)值是 10,建議將這個(gè)值設(shè)置在 10 到 100 之間。如果將 num_freqvalues 設(shè)置為零,則不保留任何頻率值的統(tǒng)計(jì)信息。
分位數(shù)統(tǒng)計(jì)信息的默認(rèn)值由 num_quantiles 數(shù)據(jù)庫配置參數(shù)控制,該值提供了數(shù)據(jù)值對(duì)于其他值而言是如何分布的有關(guān)信息。 num_quantiles 數(shù)據(jù)庫配置參數(shù)指定應(yīng)將列數(shù)據(jù)值分成的組數(shù)。其默認(rèn)值是 20,建議將該值設(shè)置在 20 到 50 之間。如果將這個(gè)參數(shù)設(shè)置為零或“1”,則不收集任何分位數(shù)統(tǒng)計(jì)信息。
如果沒有在 RUNSTATS 命令的列或表級(jí)別上指定 num_freqvalues 和 num_quantiles,那么 num_freqvalues 的值將從 num_freqvalues 數(shù)據(jù)庫配置參數(shù)中獲取,而 num_quantiles 的值將從 num_quantiles 數(shù)據(jù)庫配置參數(shù)中獲取。
可以為單個(gè)列或一組列修改頻率和分位數(shù)統(tǒng)計(jì)信息的精確度。提高分布統(tǒng)計(jì)信息的精確度將導(dǎo)致更大的 CPU 和內(nèi)存消耗,并占用更多的目錄空間。對(duì)于這些分布統(tǒng)計(jì)信息,只考慮對(duì)擁有選擇謂詞的最重要的查詢而言最為重要的列。
當(dāng)出現(xiàn)下列任何一種條件時(shí),RUNSTATS 將不收集分布統(tǒng)計(jì)信息:
- 當(dāng)將 num_freqvalues 配置參數(shù)設(shè)置為零(0),以及將 num_quantiles 數(shù)據(jù)庫配置參數(shù)設(shè)置為零(0)或 1 時(shí)。
- 當(dāng)每個(gè)數(shù)據(jù)值是惟一的時(shí)候。
- 當(dāng)該列是 LONG、LOB 或結(jié)構(gòu)化列時(shí)。
- 如果列中只有一個(gè)非空值。
- 擴(kuò)展的索引或聲明的臨時(shí)表。
包含列組統(tǒng)計(jì)信息的 RUNSTATS
列組(Column Group)統(tǒng)計(jì)信息將獲得一組列的不同值組合的數(shù)目。通常,DB2 優(yōu)化器可用的基本統(tǒng)計(jì)信息不檢測數(shù)據(jù)相關(guān)性。列組的使用將給多個(gè)謂詞的聯(lián)合選擇提供更準(zhǔn)確的估計(jì)。列組統(tǒng)計(jì)信息假設(shè)數(shù)據(jù)是均勻分布的;但還無法獲得列組上的分布統(tǒng)計(jì)信息。
較于列組的基數(shù),單個(gè)列的基數(shù)(cardinality)的乘積將獲得更好的相關(guān)性估計(jì)。
包含 LIKE STATISTICS 的 RUNSTATS
當(dāng)在 RUNSTATS 中指定 LIKE STATISTICS 子句時(shí),將收集附加的列統(tǒng)計(jì)信息。這些統(tǒng)計(jì)信息存儲(chǔ)在 SYSIBM.SYSCOLUMNS 表里的 SUB_COUNT 和 SUB_DELIM_LENGTH 列中。它們僅針對(duì)字符串列進(jìn)行收集,查詢優(yōu)化器用它們來提高“column LIKE '%abc'”和“column LIKE '%abc%'”類型謂詞的選擇性估計(jì)。
包含統(tǒng)計(jì)信息配置文件的 RUNSTATS
現(xiàn)在,可以在 DB2 V8.2 中為 RUNSTATS 建立一個(gè)統(tǒng)計(jì)信息的配置文件。統(tǒng)計(jì)信息配置文件是指一組選項(xiàng),它預(yù)先定義了特定表上將要收集的統(tǒng)計(jì)信息。
當(dāng)將命令參數(shù)“SET PROFILE”添加到 RUNSTATS 命令時(shí),將在表描述符和系統(tǒng)目錄中注冊或存儲(chǔ)統(tǒng)計(jì)信息配置文件。若要更新該統(tǒng)計(jì)信息配置文件,則可以使用命令參數(shù)“UPDATE PROFILE”。
沒有刪除配置文件的選項(xiàng)。
帶有抽樣的 RUNSTATS
隨著數(shù)據(jù)庫快速不斷地增長,通過訪問所有數(shù)據(jù)收集統(tǒng)計(jì)信息的能力可能會(huì)受到固定的批量窗口、內(nèi)存和 CPU 約束的阻礙。
目前,要運(yùn)行表上的 RUNSTATS,就要執(zhí)行全表掃描。通過數(shù)據(jù)抽樣,只需掃描數(shù)據(jù)的一個(gè)子集即可。
如果一個(gè)查詢試圖預(yù)計(jì)總的趨勢和模式,且某一誤差域(margin of error)內(nèi)的近似答案足以監(jiān)測這些趨勢和模式,那么數(shù)據(jù)抽樣或許是比全表掃描更好的選擇。
在 DB2 V8.1 中,引入了 SAMPLED DETAILED 子句,允許通過抽樣計(jì)算詳細(xì)的索引統(tǒng)計(jì)信息。該子句的使用將減少為獲得詳細(xì)索引統(tǒng)計(jì)信息而執(zhí)行的后臺(tái)計(jì)算量和所需的時(shí)間,但在大多數(shù)情況下,都會(huì)使數(shù)據(jù)足夠的精確。
帶有行級(jí)貝努里(Bernoulli)抽樣的 RUNSTATS
行級(jí)貝努里(Bernoulli)抽樣利用 sargable(search + argument-able 謂詞是一個(gè)可以由數(shù)據(jù)管理器來評(píng)估的謂詞)謂詞獲得百分之 P 的表行樣本,在樣本中包含每一行的概率是 P/100,而不包含它的概率則是 1 - P/100。
例如,對(duì)于 10% 貝努里(Bernoulli)抽樣,將會(huì)選擇 10%(10/100)的行,而拒絕 90%(1-10/100)的行。在貝努里(Bernoulli)抽樣中,每一頁將會(huì)引發(fā)一次 I/O,因?yàn)橐獟呙柙摫怼⑸梢粋€(gè)隨機(jī)數(shù)來確定是否選擇一行(類似于以 P/100 的概率扔錢幣)。即使每一頁都發(fā)生一次 I/O,我們?nèi)匀还?jié)省了處理數(shù)據(jù)所需的 CPU 時(shí)間。
在行級(jí)貝努里(Bernoulli)抽樣中,需要讀取每一個(gè)數(shù)據(jù)頁。然而,它仍然可以帶來極大的性能提高,因?yàn)?RUNSTATS 是 CPU 密集的。如果索引是可用的,那么就會(huì)改進(jìn)抽樣。如果數(shù)據(jù)是群集的,它還可以提供更準(zhǔn)確的統(tǒng)計(jì)信息(所獲得的樣本更好地代表了整個(gè)表數(shù)據(jù))。
帶有系統(tǒng)頁級(jí)抽樣的 RUNSTATS
系統(tǒng)頁級(jí)抽樣與行級(jí)抽樣類似,除了抽樣的對(duì)象是頁面而不是行。以 P/100 的概率選擇每一頁,而以 1 - P/100 的概率拒絕頁的選擇。在所選中的每一頁中,要選擇所有的行。系統(tǒng)頁級(jí)抽樣優(yōu)于全表掃描或貝努里(Bernoulli)抽樣的地方是它節(jié)省了 I/O。
抽樣頁也是預(yù)取的,所以該方法將比行級(jí)貝努里(Bernoulli)抽樣更快。與不進(jìn)行抽樣相比,頁級(jí)抽樣極大地提高了性能。
RUNSTATS repeatable 子句允許通過 RUNSTATS 語句生成相同的樣本,只要表數(shù)據(jù)沒有發(fā)生更改。為了指定該選項(xiàng),用戶還必須提供一個(gè)整數(shù),以表示將用于生成樣本的種子(seed)。通過使用相同的種子,可以生成相同的樣本。
總之,統(tǒng)計(jì)信息的準(zhǔn)確性取決于抽樣率、數(shù)據(jù)傾斜(data skew)以及用于數(shù)據(jù)抽樣的數(shù)據(jù)群集。
收集目錄統(tǒng)計(jì)信息的可供選擇的方法
對(duì)于數(shù)據(jù)庫中的所有表,收集統(tǒng)計(jì)信息的一個(gè)可供選擇的方法就是發(fā)出一條 REORGCHK 命令
REORGCHK UPDATE STATISTICS ON TABLE ALL
雖然該方法看上去是一種在多個(gè)表上收集目錄統(tǒng)計(jì)信息的快速方法,但是僅僅當(dāng) REORGCHK 可以在合理的時(shí)間內(nèi)完成執(zhí)行時(shí),該方法才是可取的。
在表的 LOAD REPLACE 期間以及索引的創(chuàng)建期間,也可以進(jìn)行目錄統(tǒng)計(jì)信息的收集。
在 UDB V8.2 中,為了在 LOAD 期間調(diào)用目錄統(tǒng)計(jì)信息的收集,必須將選項(xiàng)“STATISTICS USE PROFILE”添加到 LOAD 控制語句中。選項(xiàng)“STATISTICS YES”仍然有用,但它現(xiàn)在已是過時(shí)的語法。若在表的 LOAD 之后在同一表上執(zhí)行 RUNSTATS,那么在 LOAD 期間發(fā)出“STATISTICS USE PROFILE”的目的就是為了減少正常運(yùn)行過程中占用的時(shí)間。在執(zhí)行 load 之前,就必須創(chuàng)建統(tǒng)計(jì)信息配置文件,它現(xiàn)在允許指定與 RUNSTATS 命令中相同的統(tǒng)計(jì)信息選項(xiàng)。
包含授權(quán)和用戶訪問的 RUNSTATS
為了可以對(duì)一個(gè)表或索引收集統(tǒng)計(jì)信息,必須能夠連接到包含該表和索引的數(shù)據(jù)庫,并具有下列授權(quán)級(jí)別之一:
- sysadm
- sysctrl
- sysmaint
- dbadm
- 表上的 CONTROL 權(quán)限
當(dāng)對(duì)一個(gè)表運(yùn)行 RUNSTATS 時(shí),有兩種用戶訪問選項(xiàng):允許讀訪問和允許寫訪問。
在 RUNSTATS 命令中的參數(shù) ALLOW READ ACCESS 指定計(jì)算統(tǒng)計(jì)信息時(shí),其他用戶可以只讀地訪問該表。
在 RUNSTATS 命令中的參數(shù) ALLOW WRITE ACCESS 指定計(jì)算統(tǒng)計(jì)信息時(shí),其他用戶可以讀取或?qū)懭朐摫怼H绻摫碓谌魏螘r(shí)刻都必須是可用的,那么應(yīng)該使用該子句。
分區(qū)數(shù)據(jù)庫中的 RUNSTATS
當(dāng)在一個(gè)分區(qū)數(shù)據(jù)庫中發(fā)出 RUNSTATS 命令,并且一個(gè)表分區(qū)位于發(fā)出 RUNSTATS 的數(shù)據(jù)庫分區(qū)中時(shí),那么 RUNSTATS 將在該數(shù)據(jù)庫分區(qū)上執(zhí)行。如果表分區(qū)不在該數(shù)據(jù)庫分區(qū)上,那么將請(qǐng)求發(fā)送給數(shù)據(jù)庫分區(qū)組中持有該表分區(qū)的第一個(gè)數(shù)據(jù)庫分區(qū)。然后,在該數(shù)據(jù)庫分區(qū)上執(zhí)行 RUNSTATS 命令。
RUNSTATS 不是在分區(qū)的數(shù)據(jù)庫中并行運(yùn)行的,但對(duì)一個(gè)分區(qū)確定信息,然后對(duì)所有分區(qū)推斷出合適的估計(jì)值。有一個(gè)隱式的假設(shè):每個(gè)表中的行是均勻分布在每個(gè)多分區(qū)數(shù)據(jù)庫分區(qū)組中的所有分區(qū)上的。
下列 IBM 技術(shù)札記(technote)談到了加載一個(gè)表時(shí)運(yùn)行 RUNSTATS 可能碰到的問題。其解決方案就是確保在加載表之前,為該表定義一個(gè)分區(qū)鍵(partitioning key)。
IBM Technote # 1153232(2004-02-12):
“加載表之后,Runstats 將多分區(qū)實(shí)例上 syscat.tables 中的列 CARD 更新為零行。
摘要
如果加載某一給定表之后,其中一個(gè)分區(qū)的行數(shù)為零,并且將從該分區(qū)執(zhí)行 runstats,那么該命令將更新 syscat. 表中的列 CARD,顯示該表的行數(shù)為零。這只對(duì)多分區(qū)的實(shí)例有影響。
內(nèi)容
runstats 的行為使其將使用運(yùn)行它的分區(qū)上的數(shù)據(jù)來推測該表中的行數(shù)。例如,如果加載之后所有數(shù)據(jù)都在一個(gè)分區(qū)上,并從另一分區(qū)執(zhí)行 runstats,那么該命令將更新 syscat.tables 來表示該表的行數(shù)為零。然而,如果是從保存所有數(shù)據(jù)的分區(qū)運(yùn)行 runstats,那么它將更新 syscat.tables 來展示該表包含((該分區(qū)上的行數(shù))x(分區(qū)數(shù)目))行。
為了避免 runstats 的行為默認(rèn)行為,需要在加載表之前,為該表定義分區(qū)鍵(partitioning key)。分區(qū)鍵需要位于高度惟一的一列或一組列上,從而確保數(shù)據(jù)均勻分布在該表所定義的所有分區(qū)上。”
調(diào)整 STAT_HEAP_SZ 數(shù)據(jù)庫配置參數(shù)
stat_heap_sz 或統(tǒng)計(jì)信息堆大小的數(shù)據(jù)庫配置參數(shù)指定了使用 RUNSTATS 命令收集統(tǒng)計(jì)信息中所用堆的最大尺寸。它是在啟動(dòng) RUNSTATS 實(shí)用程序時(shí)分配的,然后當(dāng)它完成時(shí)釋放。stat_heap_sz 是代理私有內(nèi)存的一部分。因此,在收集分布統(tǒng)計(jì)信息時(shí),最好增大 stat_heap_sz 參數(shù),以便能將更多的列放入這個(gè)堆中。處理較寬的表也需要更多的內(nèi)存。當(dāng)執(zhí)行包含 SAMPLED DETAILED 選項(xiàng)的 RUNSTATS 時(shí),必須額外分配 2 MB 內(nèi)存,以確保 RUNSTATS 能夠成功運(yùn)行。
減小 RUNSTATS 對(duì)系統(tǒng)性能影響的策略
您可以使用下列策略來幫助減小 RUNSTATS 對(duì)于系統(tǒng)的性能影響:
- 一次僅在少數(shù)表和索引上運(yùn)行 RUNSTATS,在整組表中循環(huán)運(yùn)行。
- 僅指定將收集其數(shù)據(jù)分布統(tǒng)計(jì)信息的那些列。僅指定那些謂詞中所使用的列。
- 對(duì)于不同的表,在不同的分區(qū)上實(shí)現(xiàn)多個(gè)并發(fā)的 RUNSTATS。
- 僅在那些影響當(dāng)前工作負(fù)載的關(guān)鍵表上執(zhí)行 RUNSTATS。避免在不需要它的表上運(yùn)行 RUNSTATS。
- 根據(jù)表中數(shù)據(jù)發(fā)生改變的速度,調(diào)整 RUNSTATS 的頻率。
- 根據(jù) RUNSTATS 在該表上完成運(yùn)行的速度,調(diào)整 RUNSTATS 的頻率和細(xì)節(jié)。
- 僅在系統(tǒng)活動(dòng)量少的時(shí)候,安排執(zhí)行 RUNSTATS。
- 調(diào)整(Throttle)RUNSTATS,以便最大程度地減少它對(duì)系統(tǒng)的需求。
僅在系統(tǒng)活動(dòng)量少的時(shí)候安排執(zhí)行 RUNSTATS,這是最大程度地減少系統(tǒng)影響的一個(gè)好方法。然而,對(duì)于一個(gè) 24 x 7 的系統(tǒng),系統(tǒng)中可能沒有可用的窗口或活動(dòng)量少的時(shí)候。處理該情形的一種方法就是使用 RUNSTATS 的 throttling 選項(xiàng)。
throttling 選項(xiàng)將根據(jù)當(dāng)前的數(shù)據(jù)庫活動(dòng)級(jí)別,來限制實(shí)用程序所占有的資源數(shù)量。UDB 中,在調(diào)整時(shí),util_impact_lim 與 UTIL_IMPACT_PRIORITY 參數(shù)的交互確定了 RUNSTATS 的行為。UTIL_IMPACT_PRIORITY 關(guān)鍵字被用于諸如 RUNSTATS 的實(shí)用程序命令的子句中,而 util_impact_lim 則是一個(gè)實(shí)例配置參數(shù)。
util_impact_lim 參數(shù)是指允許所有已調(diào)整實(shí)用程序?qū)τ趯?shí)例的工作負(fù)載產(chǎn)生影響的百分比。如果 util_impact_lim 是 100(默認(rèn)值),則不用調(diào)整諸如 RUNSTATS 之類的實(shí)用程序調(diào)用。例如,如果將 util_impact_lim 設(shè)置為 10,那么已調(diào)整的 RUNSTATS 調(diào)用就被限定在消耗 10% 以下的工作負(fù)載。
UTIL_IMPACT_PRIORITY 關(guān)鍵字可充當(dāng)一個(gè)開關(guān),它指定 RUNSTATS 是否訂閱調(diào)整策略。
RUNSTATS 的其他問題
已聲明的全局臨時(shí)表上的 RUNSTATS
可以在已聲明的全局臨時(shí)表(DGTT)上發(fā)出 RUNSTATS 命令,但是結(jié)果的統(tǒng)計(jì)信息不存儲(chǔ)在系統(tǒng)目錄中,因?yàn)槁暶鞯呐R時(shí)表?xiàng)l目沒有目錄條目。這些統(tǒng)計(jì)信息存儲(chǔ)在表示聲明的臨時(shí)表的目錄信息的內(nèi)存結(jié)構(gòu)中。如果整個(gè)查詢經(jīng)過時(shí)間中所節(jié)省的時(shí)間比完成 RUNSTATS 所增加的時(shí)間大得多,就建議發(fā)出 RUNSTATS。
可以在 SQL 例程(過程、UDF 和方法)中發(fā)出 RUNSTATS 命令嗎?
下列 IBM 技術(shù)札記(technote)討論了該問題:
IBM Technote # 1153051
“既不能從 SQL 例程(過程、UDF、方法)、SQL 動(dòng)態(tài)復(fù)合語句發(fā)出 RUNSTATS 命令,也不能使用從 SQL 例程中發(fā)出的操作系統(tǒng)調(diào)用來發(fā)出該命令。如果需要發(fā)出 RUNSTATS 命令,那么可以直接從命令行處理器(Command Line Processor,CLP)發(fā)出它,或者通過使用 db2Runstats() API 函數(shù)(DB2 8.1 開始)從客戶機(jī)應(yīng)用程序或外部語言例程發(fā)出它,以及通過 LOAD 和 CREATE INDEX 語句發(fā)出該命令。”
可以創(chuàng)建一個(gè)名為“runstats”的 C 存儲(chǔ)過程,調(diào)用 db2Runstats() API 函數(shù)。然后,可以使用 CALL 命令調(diào)用這個(gè) C 存儲(chǔ)過程。
如何通過調(diào)用級(jí)接口(CLI)或 Java 執(zhí)行 RUNSTATS 來收集統(tǒng)計(jì)信息?
下列 IBM 技術(shù)札記回答了該問題:
IBM Technote # 1023788:
“DB2 管理 API(編程接口)sqlustat 可以用于從 DB2 應(yīng)用程序發(fā)出 RUNSTATS,例如寫入調(diào)用級(jí)接口的應(yīng)用程序。DB2 Administrative API Reference 手冊中描述了 sqlustat。”
DB2 自動(dòng)統(tǒng)計(jì)信息收集
DB2 自動(dòng)統(tǒng)計(jì)信息收集是在 DB2 UDB Version 8.2 中引入的。自動(dòng)統(tǒng)計(jì)信息收集是完全自動(dòng)表維護(hù)解決方案的一部分。其目標(biāo)是允許 DB2 確定工作負(fù)載需要哪些統(tǒng)計(jì)信息,并定期在后臺(tái)自動(dòng)運(yùn)行 RUNSTATS 實(shí)用程序,以便按需更新統(tǒng)計(jì)信息。
為了設(shè)置 SAMPLE 數(shù)據(jù)庫自動(dòng)進(jìn)行統(tǒng)計(jì)信息收集,需要為自動(dòng)維護(hù)開關(guān)設(shè)置數(shù)據(jù)庫配置參數(shù),如下所示:
db2 update db cfg for SAMPLE using AUTO_MAINT ON
db2 update db cfg for SAMPLE using AUTO_TBL_MAINT ON
db2 update db cfg for SAMPLE using AUTO_RUNSTATS ON
|
下圖(只顯示統(tǒng)計(jì)信息收集和配置選項(xiàng))展示了統(tǒng)計(jì)信息收集和配置的自動(dòng)維護(hù)命令的層次結(jié)構(gòu)和相關(guān)性。在該結(jié)構(gòu)中,可以在最高層次快速關(guān)閉自動(dòng)維護(hù)參數(shù) AUTO_MAINT,而不丟失較低層的配置設(shè)置,比如 AUTO_RUNSTATS。
圖 1. 自動(dòng)維護(hù)設(shè)置
如果需要自動(dòng)統(tǒng)計(jì)信息配置,那么可以打開參數(shù) AUTO_STATS_PROF 和 AUTO_PROF_UPD。自動(dòng)統(tǒng)計(jì)信息配置則通過確定何時(shí)和如何收集統(tǒng)計(jì)信息更進(jìn)了一步。統(tǒng)計(jì)信息配置文件是自動(dòng)生成的,自動(dòng)統(tǒng)計(jì)信息收集過程將用它來調(diào)度 RUNSTATS。可以用內(nèi)部算法來比較新收集的統(tǒng)計(jì)信息與已保存的一組統(tǒng)計(jì)信息,并基于某些觸發(fā)條件發(fā)出包含抽樣的 RUNSTATS。
當(dāng)啟用自動(dòng)統(tǒng)計(jì)信息配置時(shí),數(shù)據(jù)庫活動(dòng)的有關(guān)信息被收集并存儲(chǔ)在查詢反饋倉庫中。然后,基于查詢反饋倉庫中的數(shù)據(jù)生成統(tǒng)計(jì)配置文件。
為了允許自動(dòng)生成統(tǒng)計(jì)信息配置文件,需要設(shè)置兩個(gè)數(shù)據(jù)庫配置參數(shù):
- db2 update db cfg for SAMPLE using AUTO_STATS_PROF ON
打開該參數(shù)將啟動(dòng)查詢反饋數(shù)據(jù)的收集。
- db2 update db cfg for SAMPLE using AUTO_PROF_UPD ON
打開該參數(shù),指定使用分析查詢反饋數(shù)據(jù)的 DB2 中的建議來更新 RUNSTATS 配置文件。
在觸發(fā)自動(dòng)統(tǒng)計(jì)信息配置之前,必須通過運(yùn)行 SYSINSTALLOBJECTS 存儲(chǔ)過程創(chuàng)建查詢反饋倉庫。
按照下列方式調(diào)用該存儲(chǔ)過程:
call SYSINSTALLOBJECTS ( toolname , action , tablespacename , schemaname )
|
其中,toolname 是“ASP”或“AUTO STATS PROFILING”,對(duì)于 action,“C”表示創(chuàng)建,“D”表示刪除。
目前,不使用參數(shù) schemaname。
例如,要?jiǎng)?chuàng)建反饋倉庫,需要運(yùn)行下列存儲(chǔ)過程:
call SYSINSTALLOBJECTS ('ASP', 'C', 'USERSPACE1', '')
|
該過程將創(chuàng)建下列表、存儲(chǔ)建議以及與查詢執(zhí)行過程中碰到的謂詞有關(guān)的信息:
- SYSTOOLS.OPT_FEEDBACK_QUERY
- SYSTOOLS.OPT_FEEDBACK_PREDICATE
- SYSTOOLS.OPT_FEEDBACK_PREDICATE_COLUMN
- SYSTOOLS.OPT_FEEDBACK_RANKING
- SYSTOOLS.OPT_FEEDBACK_RANKING_COLUMN
當(dāng)禁用 AUTO_PROF_UPD 參數(shù)時(shí),可以將建議存儲(chǔ)在 SYSTOOLS.OPT_FEEDBACK_RANKING 表中。然后,當(dāng)手動(dòng)更新 RUNSTATS 配置文件時(shí),就可以查看該表中所存儲(chǔ)的建議。
DB2 自動(dòng)統(tǒng)計(jì)信息收集和配置生成只能在 DB2 串行模式下啟用;它們在聯(lián)邦的、SMP 和 MPP 環(huán)境中是不可用的