新聞中心
導讀:對于一個應用程序的性能來說,其中數(shù)據(jù)庫的性能是一個重要因素。由于應用程序及其相關的數(shù)據(jù)總會隨著時間的推移而發(fā)生變化,因此必須不斷地對數(shù)據(jù)庫進行調優(yōu)從而使其保持最佳水準。然而,花在調優(yōu)上的努力應該在一個合理的范圍之內。調優(yōu)應該有一個度,超過了這個度的一切努力只能產生負面影響。如果應用程序的性能還不能令人滿意,那么就應該考慮其他的變通辦法,比如將該應用程序移到更快的平臺上。下文就以講解DB2數(shù)據(jù)庫初始調優(yōu)和設計方面為例為大家講解數(shù)據(jù)庫的調優(yōu)。

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


咨詢
建站咨詢
