綜合分析DB2性能優(yōu)化的因素
【51CTO綜述】IBM 為社區(qū)提供了DB2 免費版本 DB2 Express-C,它提供了與 DB2 Express Edition 相同的核心數(shù)據(jù)特性,為構(gòu)建和部署應(yīng)用程序奠定了堅實的基礎(chǔ)。
DB2 性能優(yōu)化是一件較為復(fù)雜的綜合性的工作 , 需要對問題的根源作全方位的探索和思考。同時也需要較深厚的數(shù)據(jù)庫管理經(jīng)驗與優(yōu)化知識。這對于初學(xué)者來說可能有些勉為其難。但是在很多情況下,隨著 DB2 數(shù)據(jù)庫中的數(shù)據(jù)量的不斷增長或者用戶數(shù)的激增,數(shù)據(jù)庫系統(tǒng)的性能會顯著下降,而此時快速定位性能上的瓶頸則至關(guān)重要。下面簡要地介紹一下 DB2 的調(diào)優(yōu)的一些因素和工具,以及一些原理,使初學(xué)者對性能優(yōu)化能夠有一個大致的了解。
DB2 的性能優(yōu)化可以從三個方面分析:內(nèi)存,CPU 和 I/O 。
內(nèi)存因素
在內(nèi)存方面,主要是考慮緩沖池 (BUFFERPOOL) 的使用。緩沖池是一片用來緩沖從磁盤上讀取的數(shù)據(jù)和索引的內(nèi)存區(qū)域,這些數(shù)據(jù)和索引信息在緩沖池中進(jìn)行運算后最終還要寫回磁盤。緩沖池的頁面大小有四種 (4K,8K,16K,32K),分別對應(yīng)四種不同頁面大小的表空間。緩沖池的大小決定了能夠從磁盤上緩沖數(shù)據(jù)的容量大小。當(dāng)然緩沖池也不是越大越好,緩沖池過大可能會導(dǎo)致連接數(shù)據(jù)庫的時間過長,因為在連接數(shù)據(jù)庫時要為數(shù)據(jù)庫的緩沖池分配內(nèi)存空間。可以通過計算緩沖池的命中率來評估緩沖池的使用效率:緩沖池命中率 =(1-(( 數(shù)據(jù)物理讀 + 索引物理讀 )/( 數(shù)據(jù)邏輯讀 + 索引邏輯讀 ))) *100%,緩沖池命中率越大說明緩沖池的使用效率高。緩沖池命中率太小說明緩沖池太小應(yīng)當(dāng)調(diào)大。其中的數(shù)據(jù)物理讀,索引物理讀以及數(shù)據(jù)邏輯讀和索引邏輯讀都可以從緩沖池的快照中獲取。
在內(nèi)存方面要考慮的另外幾個重要因素是排序堆 (SORTHEAP),鎖列表 (LOCKLIST), 日志緩沖區(qū) (LOGBUFSZ) 。排序堆在查詢結(jié)果帶有排序選項而沒有相關(guān)索引對應(yīng)時將會被使用,排序堆太小會產(chǎn)生排序溢出 (Overflowed), 那些在排序堆中裝不下的排序數(shù)據(jù)將會溢出到一個臨時表中,這會使性能下降。與 SORTHEAP 參數(shù)相關(guān)的是 SHEAPTHRES_SHR 和 SHEAPTHRES,SHEAPTHRES_SHR 限制了一個數(shù)據(jù)庫中共享排序的***內(nèi)存,SHEAPTHRES 限制了私有排序的***內(nèi)存。 LOCKLIST 指的是一個數(shù)據(jù)庫中用來存放鎖的內(nèi)存空間,當(dāng)這個參數(shù)設(shè)得過小會導(dǎo)致在鎖用光這部分資源后導(dǎo)致鎖升級(即多個行鎖轉(zhuǎn)化為一個表鎖來釋放出更多的資源)。這會導(dǎo)致系統(tǒng)的并行性下降,很多應(yīng)用連接出現(xiàn)掛起,使得系統(tǒng)的性能衰退。所以盡可能調(diào)大 LOCKLIST 參數(shù),這里需要指出 LOCKLIST 指的并不是鎖的個數(shù),而是以數(shù)據(jù)庫頁為單位的一片內(nèi)存區(qū)域(在 32 位系統(tǒng)中每個鎖需要 96 個字節(jié),鎖上加鎖的話每個鎖則需 48 個字節(jié)。在 64 位系統(tǒng)中每個鎖需要 128 個字節(jié),鎖上加鎖的話每個鎖則需 64 個字節(jié))。與 LOCKLIST 參數(shù)對應(yīng)的是 MAXLOCKS 參數(shù),MAXLOCKS 定義的是一個百分?jǐn)?shù),它指定了一個應(yīng)用程序所能占用的***的鎖空間占 LOCKLIST 的比例。日志緩沖區(qū) (LOGBUFSZ) 指的是日志在寫到磁盤以前用于緩沖的一片內(nèi)存空間,這樣可以減少寫日志帶來的過多的 I/O 。
從版本 9 以后 DB2 推出了一個新特性自調(diào)節(jié)內(nèi)存管理器 (STMM: Self Tuning Memory Manager), 這個特性使得很多內(nèi)存參數(shù)如前面所述的 SORTHEAP,LOCKLIST,LOGBUFSZ 等進(jìn)行自動調(diào)節(jié),當(dāng)數(shù)據(jù)庫參數(shù) SELF_TUNING_MEM 設(shè)為 ON, 這些參數(shù)設(shè)為 AUTOMATIC 即可以進(jìn)行自動調(diào)整。這樣可以節(jié)省很多人工調(diào)整的時間。
CPU 因素
關(guān)于 CPU 因素首先是考慮 DB2 優(yōu)化器 (OPTIMIZER) 對訪問計劃 (ACCESS PLAN) 的分析與優(yōu)化。一般來說,一條 SQL 在執(zhí)行時首先會被解析,然后進(jìn)行語義分析,進(jìn)而重寫 SQL, 優(yōu)化器會對重寫過的 SQL 進(jìn)行基于成本的分析最終選擇最有效的訪問計劃。最終生成可執(zhí)行代碼(執(zhí)行計劃)來執(zhí)行這條語句。查詢訪問計劃的工具有很多,既有圖形化工具 Visual Explain,也有命令 db2exfmt 來格式化解釋表 (Explain tables) 中的數(shù)據(jù)生成 ACCESS PLAN 。還有命令 db2expln 查詢 ACCESS PLAN 。
在 DB2 里的優(yōu)化級別分為九級,缺省是第五級,級別越高優(yōu)化器分析得程度越深。這個級別有數(shù)據(jù)庫配置參數(shù) DFT_QUERYOPT 決定。并不是級別設(shè)得越高性能越好,因為對于一些較為簡單的 SQL 語句,如果優(yōu)化級別過高那么花在優(yōu)化 SQL 上的時間就會過長,而執(zhí)行時間相對來說很短,有些得不償失。在選擇訪問計劃時,索引掃描的效率往往會比表掃描要高,所以索引的優(yōu)化也是值得注意的。正確的建立索引會使查詢性能大幅度的提高。
在 DB2 中連接 (JOIN) 分為三種:嵌套循環(huán)連接 (nest-loop join), 合并連接 (merge-join), 散列表連接 (hash-join) 。一般來說效率***的是嵌套循環(huán)連接,這種連接采用的是笛卡兒集,進(jìn)行多次循環(huán)遍歷得到結(jié)果。而合并連接和散列表連接只進(jìn)行一次循環(huán)遍歷,相對來說效率較高。其中散列表連接可以采用多個等式做為條件而合并連接只能采用單個等式作為條件。但是在有索引掃描的情況下嵌套循環(huán)連接效率則更高。當(dāng)優(yōu)化級別等于零時,連接只能采用嵌套循環(huán)連接, 當(dāng)優(yōu)化級別大于等于 1 時,連接可以采用合并連接。當(dāng)優(yōu)化級別大于 5 時連接可以采用散列表連接。散列表連接要求 SORTHEAP 比較大,因為要為生成散列表準(zhǔn)備空間。
在考慮 CPU 因素時還要考慮 CPUSPEED 這個參數(shù),這個參數(shù)標(biāo)明了 CPU 的運行速度,它會幫助優(yōu)化器評估***的訪問計劃。一般來說這個參數(shù)設(shè)為 -1,優(yōu)化器將自動計算 CPU 的速度。另外運用多分區(qū)的特性可以把一個數(shù)據(jù)庫分布到多臺機器上,這樣可以充分利用多臺機器的 CPU 的資源對應(yīng)用程序的事務(wù)進(jìn)行并行處理,從而提高數(shù)據(jù)庫的性能。
I/O 因素
關(guān)于 I/O 因素要考慮以下幾個方面:首先是磁盤的 I/O, 為了能夠***化磁盤的 I/O 可以把數(shù)據(jù),索引以及日志分別放在不同的硬盤上。因為在一個事務(wù)中數(shù)據(jù)和索引可能需要同時訪問,而在事務(wù)提交時,數(shù)據(jù)和日志要同時寫入磁盤,而且有可能索引也要同步維護(hù),所以將它們放在不同的硬盤上可以使它們的讀寫并行運行,從而不致使磁盤成為瓶頸。同時選擇數(shù)據(jù)庫管理表空間 (DMS) 要比系統(tǒng)管理表空間 (SMS) 性能要好,因為讀寫 SMS 需要經(jīng)過操作系統(tǒng)的 cache 再到緩沖池,而可以采用裸設(shè)備的 DMS 則不需要。但是 DMS 相對 SMS 來說維護(hù)起來較麻煩。
其次要考慮的是日志文件的大小,當(dāng)數(shù)據(jù)庫在寫事務(wù)日志時當(dāng)一個日志文件寫滿后會轉(zhuǎn)向另外一個日志文件,這種日志文件的切換會造成操作系統(tǒng)上的開銷。所以應(yīng)當(dāng)盡量將日志文件大小(LOGFILSIZ)設(shè)得大一些,這樣可以減少日志文件切換的次數(shù)。但是日志文件過大難免會造成一些空間的浪費。
同時也要考慮到隔離級別的因素,在 DB2 中隔離級別分成 4 級:可重復(fù)的讀,讀穩(wěn)定性,游標(biāo)穩(wěn)定性和未提交的讀。這四種級別逐個降低。越高的隔離級別越能保證數(shù)據(jù)完整性,但卻會降低并發(fā)性,所以應(yīng)當(dāng)綜合權(quán)衡后做出決定。隔離級別可以通過如下命令來改變:
CHANGE ISOLATION TO=CS|RR|RS|UR
在連接方面還要考慮到代理和連接的關(guān)系,這也會影響到數(shù)據(jù)庫的并發(fā)性,具體信息可以參考資源部分。
***要考慮的還是關(guān)于多分區(qū)的特性。在多分區(qū)數(shù)據(jù)庫中,一個請求首先傳到協(xié)調(diào)分區(qū),然后由協(xié)調(diào)分區(qū)將請求細(xì)分成多個部分發(fā)送到其他分區(qū),這樣數(shù)據(jù)可以在各個分區(qū)進(jìn)行并行讀寫,實現(xiàn) I/O ***化。
性能優(yōu)化相關(guān)工具
在 DB2 中有很多和性能優(yōu)化相關(guān)的工具和命令,下面簡單地介紹幾種:
- SNAPSHOT : 這是 DB2 獲取數(shù)據(jù)庫信息快照的一種方法。它能夠獲取在數(shù)據(jù)庫中關(guān)于緩沖池,鎖,排序以及 SQL 等等信息。 DBA 可以通過獲取這些信息來對數(shù)據(jù)庫中的各組件進(jìn)行評估來分析問題的瓶頸。
- DB2PD : 這個命令是用來分析數(shù)據(jù)庫的當(dāng)前狀態(tài),它帶有很多參數(shù)。可以用來分析應(yīng)用程序,代理,內(nèi)存塊,緩沖池,日志及鎖狀態(tài)等信息。
- RUNSTATS : 這個命令是用來收集數(shù)據(jù)庫中數(shù)據(jù)的***統(tǒng)計信息,并更新到系統(tǒng)表中。更新統(tǒng)計信息將會促使優(yōu)化器選擇更加符合實際的高效的訪問計劃,從而提高工作效率。
- REORG : 這個命令用來重新整理數(shù)據(jù)庫中數(shù)據(jù)和索引的碎片,使其在物理上可以得以按一定規(guī)則排列,這樣可以加快檢索的速度。
- DB2DART : 這個命令是一個數(shù)據(jù)庫的分析和報告工具,它用來檢查表空間,索引以及數(shù)據(jù)庫結(jié)構(gòu)的正確性,分析在性能問題上的一些原因。
- DB2SUPPORT : 這個命令用來收集 DB2 和操作系統(tǒng)的所有相關(guān)信息并生成一個壓縮文件,可傳送給優(yōu)化人員進(jìn)行分析。
還有一些 DB2 中其他的文件可以用來分析性能問題,比如說診斷日志,追蹤文件等。一些第三方的工具也可供參考,如“ tivoli monitor for db2 ”, QUEST 等等。
其他性能因素
XML 的優(yōu)化: 在 DB2 V9 以后引入了純 XML 的數(shù)據(jù)類型,這是一種層次型數(shù)據(jù)類型。這和傳統(tǒng)的關(guān)系型數(shù)據(jù)類型不一樣,在 V9 以前 DB2 存儲 XML 數(shù)據(jù)使用 CLOB 數(shù)據(jù)類型,應(yīng)用程序在存取 XML 數(shù)據(jù)的時候必須先要解析 XML 再使用其數(shù)據(jù)。而在純 XML 類型中,可以直接讀取其中的元素,這樣性能會有較大的提高。另外針對純 XML 還有 XML 的索引,也會增大存取的性能。
操作系統(tǒng): 數(shù)據(jù)庫存在于操作系統(tǒng)之上,操作系統(tǒng)的性能將直接影響到數(shù)據(jù)庫的運行效率,因此優(yōu)化操作系統(tǒng)也是優(yōu)化數(shù)據(jù)庫的一個重要過程。在操作系統(tǒng)級別上可以對內(nèi)存進(jìn)行優(yōu)化,比如說對系統(tǒng)共享內(nèi)存,信號量以及虛擬內(nèi)存的設(shè)置等等都可以影響到數(shù)據(jù)庫的性能。同時在磁盤的分布上也會影響到數(shù)據(jù)庫 I/O 效率。
網(wǎng)絡(luò): 網(wǎng)絡(luò)將會影響到數(shù)據(jù)庫的 I/O 性能,當(dāng)數(shù)據(jù)通過網(wǎng)絡(luò)在客戶端和服務(wù)器端進(jìn)行傳送時,網(wǎng)絡(luò)上出現(xiàn)瓶頸會導(dǎo)致數(shù)據(jù)庫 I/O 性能顯著下降。所以選擇優(yōu)良的網(wǎng)絡(luò)設(shè)備以及配置良好的網(wǎng)絡(luò)環(huán)境對數(shù)據(jù)庫性能相當(dāng)重要。同時也要考慮到防火墻的因素,有時防火墻會阻擋來自某些 IP 的數(shù)據(jù)包。
編者介紹
李越 (liyyue@cn.ibm.com), 軟件工程師, IBM
李越 IBM 中國軟件開發(fā)中心 WebSphere Federation Server 測試部門軟件工程師。曾在 developerWorks 中國發(fā)表過有關(guān)優(yōu)化 DB2 的代理和連接的文章。
王飛鵬, 軟件工程師, WSO2 Inc
王飛鵬來自 IBM 中國 Avalanche 團隊,目前從事 Oracle/Teradata 數(shù)據(jù)庫遷移到 DB2 數(shù)據(jù)庫的售前咨詢和客戶支持工作;有為電信、地鐵、中央部委實施數(shù)據(jù)庫、數(shù)據(jù)倉庫的成功經(jīng)驗;是 DB2 性能優(yōu)化、Oracle 遷移到 DB2、DB2 9.7訓(xùn)練營、IBM Information Server 訓(xùn)練營、DB2 大學(xué)生訓(xùn)練營的培訓(xùn)講師;擁有軟件專利3項,著有《DB2設(shè)計與性能優(yōu)化-原理、方法和實踐》一書。
狄浩, 軟件工程師, WSO2 Inc
狄浩,IBM 中國軟件開發(fā)中心軟件工程師,主要從事 IBM CM 內(nèi)容管理產(chǎn)品的相關(guān)工作,最近對 DB2 的性能調(diào)優(yōu)比較感興趣。
張蓉蓉 (rrzhang@cn.ibm.com), 軟件工程師, WSO2 Inc