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