DB2數(shù)據(jù)庫(kù)初始調(diào)優(yōu)和設(shè)計(jì)方面的考慮
導(dǎo)讀:對(duì)于一個(gè)應(yīng)用程序的性能來(lái)說(shuō),其中數(shù)據(jù)庫(kù)的性能是一個(gè)重要因素。由于應(yīng)用程序及其相關(guān)的數(shù)據(jù)總會(huì)隨著時(shí)間的推移而發(fā)生變化,因此必須不斷地對(duì)數(shù)據(jù)庫(kù)進(jìn)行調(diào)優(yōu)從而使其保持最佳水準(zhǔn)。然而,花在調(diào)優(yōu)上的努力應(yīng)該在一個(gè)合理的范圍之內(nèi)。調(diào)優(yōu)應(yīng)該有一個(gè)度,超過(guò)了這個(gè)度的一切努力只能產(chǎn)生負(fù)面影響。如果應(yīng)用程序的性能還不能令人滿意,那么就應(yīng)該考慮其他的變通辦法,比如將該應(yīng)用程序移到更快的平臺(tái)上。下文就以講解DB2數(shù)據(jù)庫(kù)初始調(diào)優(yōu)和設(shè)計(jì)方面為例為大家講解數(shù)據(jù)庫(kù)的調(diào)優(yōu)。
本文中提到的命令和語(yǔ)法是基于 DB2 UDB V7 的,如果您使用的是 DB2 UDB V8,可能會(huì)稍有差異。
數(shù)據(jù)庫(kù)設(shè)計(jì)方面的考慮
數(shù)據(jù)庫(kù)調(diào)優(yōu)始于設(shè)計(jì)階段。假設(shè)硬件的選擇是基于其他方面的考慮的,那么第一個(gè)要決定的就是存儲(chǔ)架構(gòu)。DB2 所使用的驅(qū)動(dòng)器越多、越快,則潛在的性能將越好。對(duì)于表空間(tablespaces )和其他對(duì)象(日志,備份文件,等等)的位置應(yīng)該小心仔細(xì)地加以規(guī)劃。尤其重要的是,要盡量保證日志和備份處在不同的驅(qū)動(dòng)器上,這樣做不但是為了性能,也是為了便于恢復(fù)。
表空間設(shè)計(jì)是整個(gè)數(shù)據(jù)庫(kù)設(shè)計(jì)中的一個(gè)重要部分。通過(guò)創(chuàng)建不止一個(gè)的用戶表空間可以增強(qiáng)性能。在下面三種情況下,使用多個(gè)表空間就很有用:
控制 I/O,如果這些表空間可以位于不同的驅(qū)動(dòng)器上的話。
使用不同的頁(yè)面大小(pagesize)。
控制緩沖池。
在大多數(shù)情況下,隔離的表空間是為索引和大型對(duì)象而創(chuàng)建的。以相同的頁(yè)面大小創(chuàng)建多于一個(gè)的表空間并沒(méi)有什么好處。
比起系統(tǒng)管理的表空間來(lái),數(shù)據(jù)庫(kù)管理(Database-managed)的表空間(尤其是在原始設(shè)備上)能夠提供更好的性能。在決定頁(yè)面大小時(shí)要記住,DB2 在一頁(yè)上最多只能放 255 行,剩余的空間將不被使用。例如,如果平均行長(zhǎng)度是 50 字節(jié),那么一頁(yè)最多使用的空間是 50*255=12750 字節(jié)。如果將該表放在頁(yè)面大小為 16K 或者 32K 的表空間中,那么有些頁(yè)就會(huì)被浪費(fèi)。反之,如果有些表有更長(zhǎng)的行,或者有很多的列,(具體的限制參見(jiàn) SQL 參考手冊(cè)中 CREATE TABLE 語(yǔ)句),那么頁(yè)面大小就需要大于 4K。如果要以一種連續(xù)的方式(例如,群集表)來(lái)訪問(wèn)數(shù)據(jù),那么采用更大的頁(yè)面大小可以獲得更好的性能,相反,如果對(duì)數(shù)據(jù)的訪問(wèn)采用的是隨機(jī)方式,那么最好使用盡可能小的頁(yè)面大小。
每個(gè)表空間都與具有相同頁(yè)面大小的一個(gè)緩沖池相關(guān)聯(lián)(一個(gè)緩沖池可以與不止一個(gè)的表空間相關(guān)聯(lián))。在使用多個(gè)緩沖池的時(shí)候要謹(jǐn)慎。由于可用的存儲(chǔ)是有限的,為某個(gè)緩沖池分配過(guò)多的空間勢(shì)必減少其他緩沖池的寬度,從而導(dǎo)致整體性能的降低。緩沖池調(diào)優(yōu)最好是在檢測(cè)數(shù)據(jù)庫(kù)性能和基準(zhǔn)的基礎(chǔ)上進(jìn)行。DB2 善于動(dòng)態(tài)地管理可用空間,因此,在大多數(shù)情況下使用最少數(shù)量的緩沖池可以得到較好的性能。
長(zhǎng)期以來(lái),表設(shè)計(jì)的重要性就在于標(biāo)準(zhǔn)化。無(wú)冗余數(shù)據(jù)占據(jù)著最少的空間,并且具有最好的完整性。然而,無(wú)冗余數(shù)據(jù)并不能提供最好的性能。為了消除一點(diǎn)點(diǎn)的冗余,需要?jiǎng)?chuàng)建額外的表,這使得查詢時(shí)需要額外地結(jié)合這額外創(chuàng)建的表,從而增加查詢的復(fù)雜性。在平衡這兩方面的需求時(shí),需要有正確的判斷。通常,通過(guò)生成冗余數(shù)據(jù)可以增加性能,但是這要采取一種受約束的方式,即冗余數(shù)據(jù)所采取的形式必須是索引和匯總表。如果要經(jīng)常訪問(wèn)匯總數(shù)據(jù),那么后者可以明顯增加性能。對(duì)刷新頻率的評(píng)估應(yīng)該以信息需要保持的新鮮程度為依據(jù)。
索引是性能調(diào)優(yōu)中最重要的方面之一。通常,對(duì)表的訪問(wèn)都是基于一些標(biāo)準(zhǔn)的。根據(jù)組成這些標(biāo)準(zhǔn)的一些列構(gòu)建索引,可以動(dòng)態(tài)地減少查詢相關(guān)的開(kāi)銷(xiāo)。對(duì)于在線維護(hù)的不穩(wěn)定的表應(yīng)該創(chuàng)建少量的索引(一個(gè)或兩個(gè)),而對(duì)于大型的歷史性的表,由于需要通過(guò)多種方式進(jìn)行查詢,則需要?jiǎng)?chuàng)建很多的索引。一條索引中的列數(shù)應(yīng)該盡量地少,除非很多查詢都可以通過(guò)一個(gè)“index only”搜索來(lái)完成。為了這個(gè)目的, INCLUDE 選項(xiàng)允許將其他字段附加到索引上,其開(kāi)銷(xiāo)則小于完全索引方式??梢赃x擇一個(gè)表的某一索引作為群集索引,或者在 REORGANIZE 命令中指定該索引。表數(shù)據(jù)將保持由該索引指定的順序。當(dāng)大量的查詢基于該索引訪問(wèn)大量的行時(shí),這種做法很有用。索引通常被放在它們自己的表空間中,擁有它們自己的緩沖池,以防止數(shù)據(jù)頁(yè)數(shù)量很多時(shí)會(huì)將索引頁(yè)擠出。
應(yīng)用程序設(shè)計(jì)方面的考慮
應(yīng)用程序設(shè)計(jì)同樣會(huì)影響到數(shù)據(jù)庫(kù)。首要的一步就是要確保應(yīng)用程序只要求數(shù)據(jù)庫(kù)管理器做必需的工作。例如,通過(guò)使用 SELECT * 來(lái)請(qǐng)求所有的列在一定程度上可以使得程序的速度加快,但是這樣做卻降低了性能,因?yàn)樾枰~外的數(shù)據(jù)移動(dòng),而且阻止了“index only”掃描。在查詢中包括不必要的子句,例如 ORDER BY 或者 DISTINCT ,就是請(qǐng)求數(shù)據(jù)庫(kù)管理器做額外工作的一個(gè)例子。如果列的順序?qū)?yīng)用程序的運(yùn)行沒(méi)有影響,那么就可以省下排序所花的時(shí)間。
控制鎖(locking)特性對(duì)于增加數(shù)據(jù)庫(kù)的吞吐量非常重要。即使是對(duì)于只讀事務(wù),提交也具有極大的重要性,因?yàn)閷?duì)于這樣的事務(wù)同樣也要使用鎖。選擇正確的隔離級(jí)別非常重要。應(yīng)該使用盡可能低的隔離級(jí)別,只要在這種級(jí)別上應(yīng)用程序能夠運(yùn)行就行了。對(duì)于鎖來(lái)說(shuō),使用可重復(fù)讀隔離級(jí)別是極其昂貴的,并且也減少了并發(fā)性。只要不打算對(duì)結(jié)果集進(jìn)行更新,那么就應(yīng)該包括 FOR READ ONLY 子句。這樣就可以保證獨(dú)占的鎖不被獲得。 FOR UPDATE 子句將消除對(duì)重新獲得更高級(jí)別鎖的需求。在某些環(huán)境下,在查詢之前通過(guò)應(yīng)用程序獲得一個(gè)表鎖可以防止獲取很多的行鎖,從而防止了對(duì)鎖的逐步升級(jí)。
查詢優(yōu)化是另一個(gè)可以節(jié)省大量資源的方面。優(yōu)化的級(jí)別可以通過(guò)數(shù)據(jù)庫(kù)配置參數(shù) dft_queryopt 進(jìn)行設(shè)置。并且,在靜態(tài) SQL 中可以通過(guò) PREP 和 BIND 命令進(jìn)行重設(shè),在動(dòng)態(tài) SQL 中可以通過(guò) SET CURRENT QUERY OPTIMIZATION 語(yǔ)句進(jìn)行重設(shè)。對(duì)于復(fù)雜的查詢,可能需要第 5 級(jí)或者更高的級(jí)別??梢允褂?db2batch 工具來(lái)評(píng)測(cè)花在編譯和執(zhí)行 SQL 語(yǔ)句上的時(shí)間。至于結(jié)果,要記住,靜態(tài) SQL 語(yǔ)句通常是編譯一次,執(zhí)行多次;對(duì)于動(dòng)態(tài) SQL 也是一樣,因?yàn)榻Y(jié)果要緩存。
初始調(diào)優(yōu)
在創(chuàng)建了數(shù)據(jù)庫(kù)和表空間之后,可以使用 Performance Wizard 來(lái)設(shè)置初始數(shù)據(jù)庫(kù)配置。選擇數(shù)據(jù)庫(kù)以及“Configure Performance Using Wizard”選項(xiàng)。這將允許更快地裝載數(shù)據(jù)。在創(chuàng)建了數(shù)據(jù)對(duì)象之后,就應(yīng)該裝載數(shù)據(jù)。
調(diào)優(yōu)的第一步就是使用 RUNSTATS 命令收集統(tǒng)計(jì)信息。為了獲得整套的統(tǒng)計(jì)信息,應(yīng)該指定“WITH DISTRIBUTION AND INDEXES ALL”選項(xiàng)。 RUNSTATS 應(yīng)該是數(shù)據(jù)庫(kù)維護(hù)的一個(gè)常規(guī)的部分。應(yīng)該根據(jù)數(shù)據(jù)庫(kù)的更新率有規(guī)律地(每日,每周,每月)調(diào)用 RUNSTATS 。如果對(duì)數(shù)據(jù)作了大的更改(裝載或者刪除了大量的行),也應(yīng)運(yùn)行 RUNSTATS 命令。統(tǒng)計(jì)信息可用于決定對(duì)于一個(gè)查詢來(lái)說(shuō)哪一個(gè)訪問(wèn)計(jì)劃是最有效的。在執(zhí)行了 RUNSTATS 命令之后,受到影響的包應(yīng)該重新綁定。
在此之后應(yīng)該再次執(zhí)行 Performance Wizard,這一次是為了指定要填充的數(shù)據(jù)庫(kù)。Performance Wizard 將更改某些數(shù)據(jù)庫(kù)配置參數(shù)。如果正確地解決了這些問(wèn)題,那么由 Performance Wizard 產(chǎn)生的值通常會(huì)比較理想。Performance Wizard 使您可以在第一屏恢復(fù)先前的配置(如果有的話)。您應(yīng)該認(rèn)真閱讀窗口中的解說(shuō)。最后一屏將顯示老的和新的數(shù)據(jù)庫(kù)配置,并對(duì)所有的更改用粗體進(jìn)行高亮顯示。
如果在測(cè)試時(shí)性能不令人滿意,那么就應(yīng)該使用 Database System Monitor(參見(jiàn) System Monitor Guide and Reference以了解細(xì)節(jié)),或者將問(wèn)題的源頭縮小至幾個(gè)事務(wù),來(lái)查探這一問(wèn)題的起因。對(duì)于特定的查詢,解釋工具(參見(jiàn) Administration Guide 以了解細(xì)節(jié))提供了有關(guān)性能問(wèn)題可能的起因的有價(jià)值的信息。根據(jù)這些信息,可以對(duì)索引結(jié)構(gòu)或者數(shù)據(jù)庫(kù)參數(shù)作出更改。
結(jié)束語(yǔ)
先前的討論強(qiáng)調(diào)了調(diào)優(yōu)時(shí)需要考慮的的一些主要方面。調(diào)優(yōu)是一個(gè)反復(fù)的過(guò)程。隨著時(shí)間的推移,數(shù)據(jù)庫(kù)中的數(shù)據(jù)以及應(yīng)用程序需要更改。這時(shí),為了適應(yīng)新的需要,應(yīng)該對(duì)性能進(jìn)行檢測(cè)并對(duì)數(shù)據(jù)庫(kù)作出更改。對(duì)數(shù)據(jù)庫(kù)的配置參數(shù)或者其他方面所做的更改要有基準(zhǔn),要打破常規(guī)。在某些時(shí)候,有些更改看上去是對(duì)的,實(shí)際上卻會(huì)對(duì)數(shù)據(jù)庫(kù)產(chǎn)生負(fù)面的影響。希望大家通過(guò)上文的學(xué)習(xí),都能夠很好的掌握關(guān)于DB2數(shù)據(jù)庫(kù)初始調(diào)優(yōu)和設(shè)計(jì)方面的知識(shí)。
【編輯推薦】