關(guān)于數(shù)據(jù)庫優(yōu)化有很多方法,這里針對數(shù)據(jù)庫的runstat(運(yùn)行統(tǒng)計(jì))和reorg(重組)進(jìn)行以下說明;
一、runstats:
1、runstats的作用:
一個SQL在寫完并運(yùn)行之后,其實(shí)我們只是告訴了DB2去做什么,而不是如何去做。而,具體的如何去做,就取決于優(yōu)化器。優(yōu)化器為了生成最優(yōu)的執(zhí)行計(jì)劃,就得掌握當(dāng)前的系統(tǒng)信息,目錄中的統(tǒng)計(jì)信息等等。
runstats命令就是用來收集數(shù)據(jù)庫對象的狀態(tài)信息,這對優(yōu)化器生成最優(yōu)的執(zhí)行計(jì)劃至關(guān)重要。
2、什么時候需要runstats:
在給表創(chuàng)建一個index后,我們最好做一次runstat,否則可能index沒有生效。不過有說法稱在8.2版本以后的DB2中,會在INDEX之后自動進(jìn)行runstats;
在對table做了一次reorg后,記得要做一次runstats。因?yàn)閷Ρ碜鰎eorg,會修改表的很多信息,比如高水位等,所以做一次runstats,可以更新統(tǒng)計(jì)信息。
當(dāng)表里數(shù)據(jù)發(fā)生了比較大的變化,一般來說,大約表里面的數(shù)據(jù)量的10%-20%發(fā)生了變化,就應(yīng)該作一次runstats。這些變化包括刪除,修改,插入。對于一些非常大的表,比方在某些醫(yī)院,出院明細(xì)賬表非常巨大。這個時候,完整的對一個大表做runstats可能花費(fèi)時間相當(dāng)大,需要提前做好準(zhǔn)備;
3、runstats的語法:
runstats on table [模式名].[表名] with distribution and detailed indexes all
你可以在所有列上,或者僅僅在某些列或列組(除了LONG和LOB列)上執(zhí)行RUNSTATS。如果沒有指定特定列的子句,系統(tǒng)則會使用默認(rèn)的ON ALL COLUMNS子句。
使用RUNSTATS WITH DISTRIBUTION
當(dāng)您已確定表中包含不是統(tǒng)一分布的數(shù)據(jù)時,可以運(yùn)行包含WITH DISTRIBUTION子句的RUNSTATS。目錄統(tǒng)計(jì)信息表通常包含關(guān)于表中最高和最低值的信息,而優(yōu)化器假定數(shù)據(jù)值是在兩個端點(diǎn)值之間均勻分布的。然而,如果數(shù)據(jù)值彼此之間差異較大,或者群集在某些點(diǎn)上,或者是碰到許多重復(fù)的數(shù)據(jù)值,那么優(yōu)化器就無法選擇一個最佳的訪問路徑,除非收集了分布統(tǒng)計(jì)信息。使用WITH DISTRIBUTION子句還可以幫助查詢處理沒有參數(shù)標(biāo)志符(parameter marker)或主機(jī)變量的謂詞,因?yàn)閮?yōu)化器仍然不知道運(yùn)行時的值是有許多行,還是只有少數(shù)行。
如果為單一索引進(jìn)行runstats,可以使用:
runstats on table [模式名].[表名] for indexes [索引名]
4、圖像界面下runstats;
首先在維護(hù)機(jī)上編目需要優(yōu)化的的數(shù)據(jù)庫;
連接數(shù)據(jù)庫;
找到需要做runstats的表,右鍵,選擇運(yùn)行統(tǒng)計(jì)信息;
二、reorg
在對表數(shù)據(jù)進(jìn)行許多更改之后,邏輯上連續(xù)的數(shù)據(jù)可能會位于不連續(xù)的物理數(shù)據(jù)頁上,在許多插入操作創(chuàng)建了溢出記錄時尤其如此。按這種方式組織數(shù)據(jù)時,數(shù)據(jù)庫管理器必須執(zhí)行其他讀操作才能訪問順序數(shù)據(jù)。另外,在刪除大量行后,也需要執(zhí)行其他的讀操作。
表重組操作會整理數(shù)據(jù)碎片來減少浪費(fèi)的空間,并對行進(jìn)行重新排序以合并溢出記錄,從而加快數(shù)據(jù)訪問速度并最終提高查詢性能。還可以指定根據(jù)特定索引來重新排序數(shù)據(jù),以便查詢時通過最少次數(shù)據(jù)讀取操作就可以訪問數(shù)據(jù)。
|
|