DB2優(yōu)化(簡易版)
更新時間:2007年03月06日 00:00:00 作者:
正在看的db2教程是:DB2優(yōu)化(簡易版)。預備—monitors ON
db2 "update monitor switches using
lock ON sort ON bufferpool ON uow ON
table ON statement ON"
打開監(jiān)視開關,獲取需要的性能信息
最簡單而最見成效的—Bufferpool
緩沖池是內(nèi)存中的一塊存儲區(qū)域,用于臨時讀入和更改數(shù)據(jù)庫頁(包含表行或索引項)。緩沖池的用途是為了提高數(shù)據(jù)庫系統(tǒng)的性能。從內(nèi)存訪問數(shù)據(jù)要比從磁盤訪問數(shù)據(jù)快得多。因此,數(shù)據(jù)庫管理器需要從磁盤讀取或寫入磁盤的次數(shù)越少,性能就越好。對一個或多個緩沖池進行配置之所以是調(diào)優(yōu)的最重要方面,是因為連接至數(shù)據(jù)庫的應用程序的大多數(shù)數(shù)據(jù)(不包括大對象和長字段數(shù)據(jù))操作都在緩沖池中進行。
缺省情況下,應用程序使用緩沖池 IBMDEFAULTBP,它是在創(chuàng)建數(shù)據(jù)庫時創(chuàng)建的。當 SYSCAT.BUFFERPOOLS 目錄表中該緩沖池的 NPAGES 值為 -1 時,DB2 數(shù)據(jù)庫配置參數(shù) BUFFPAGE 控制著緩沖池的大小。否則會忽略 BUFFPAGE 參數(shù),并且用 NPAGES 參數(shù)所指定的頁數(shù)創(chuàng)建緩沖池。
建議對于僅使用一個緩沖池的應用程序,將 NPAGES 更改成 -1,這樣 BUFFPAGE 就可以控制該緩沖池的大小。這使得更新和報告緩沖池大小以及其它 DB2 數(shù)據(jù)庫配置參數(shù)變得更加方便。
確保可以使用數(shù)據(jù)庫配置中的 BUFFPAGE 參數(shù)來控制緩沖池大小之后,將該參數(shù)設置成合適的值。根據(jù)數(shù)據(jù)庫的大小和應用程序的性質(zhì)將該參數(shù)設置成一個合理的大值,這種做法很安全。通常,該參數(shù)的缺省值非常小,可能滿足不了要求。
db2 "get snapshot for all bufferpools"
在數(shù)據(jù)庫快照或緩沖池快照的快照輸出中,查找下列"logical reads"和"physical reads",這樣就可以計算出緩沖池命中率,它可以幫助調(diào)優(yōu)緩沖池:
緩沖池命中率表明數(shù)據(jù)庫管理器不需要從磁盤裝入頁(即該頁已經(jīng)在緩沖池中)就能處理頁請求的時間百分比。緩沖池的命中率越高,使用磁盤 I/O 的頻率就越低。按如下計算緩沖池命中率:
(1 - ((buffer pool data physical reads + buffer pool index physical reads) /
(buffer pool data logical reads + pool index logical reads))
) * 100%
這個計算考慮了緩沖池高速緩存的所有頁(索引和數(shù)據(jù))。理想情況下,該比率應當超過 95%,并盡可能接近 100%。要提高緩沖池命中率,請嘗試下面這些方法:
增加緩沖池大小。
考慮分配多個緩沖池,如果可能的話,為每個經(jīng)常被訪問的大表所屬的表空間分配一個緩沖池,為一組小表分配一個緩沖池,然后嘗試一下使用不同大小的緩沖池以查看哪種組合會提供最佳性能。
如果已分配的內(nèi)存不能幫助提高性能,那么請避免給緩沖池分配過多的內(nèi)存。應當根據(jù)取自測試環(huán)境的快照信息來決定緩沖池的大小。
太小的緩沖池會產(chǎn)生過多的、不必要的物理 I/O。太大的緩沖池使系統(tǒng)處在操作系統(tǒng)頁面調(diào)度的風險中并消耗不必要的 CPU 周期來管理過度分配的內(nèi)存。正好合適的緩沖池大小就在"太小"和"太大"之間的某個平衡點上。適當?shù)拇笮〈嬖谟诨貓髮⒁_始減少的點上。
獲得最佳性能的—SQL
一條糟糕的 SQL 語句會徹底破壞一切。一個相對簡單的 SQL 語句也能夠搞糟一個調(diào)整得很好的數(shù)據(jù)庫和機器。對于很多這些語句,天底下(或在文件中)沒有 DB2 UDB 配置參數(shù)能夠糾正因錯誤的 SQL 語句導致的高成本的情況。
更糟糕的是,DBA 常常受到種種束縛:不能更改 SQL(可能是因為它是應用程序供應商提供的)。這給 DBA 只留下三條路可走:
1. 更改或添加索引
2. 更改群集
3. 更改目錄統(tǒng)計信息
健壯的應用程序由成千上萬條不同的 SQL 語句組成。這些語句執(zhí)行的頻率隨應用程序的功能和日常的業(yè)務需要的不同而不同。SQL 語句的實際成本是它執(zhí)行一次的成本乘以它執(zhí)行的次數(shù)。
每個 DBA 所面臨的重大的任務是,識別具有最高"實際成本"的語句的挑戰(zhàn),并且減少這些語句的成本。
通過本機 DB2 Explain 實用程序、一些第三方供應商提供的工具或 DB2 UDB SQL Event Monitor 數(shù)據(jù),可以計算出執(zhí)行一次 SQL 語句所用的資源成本。但是語句執(zhí)行頻率只能通過仔細和耗時地分析 DB2 UDB SQL Event Monitor 的數(shù)據(jù)來了解。
最佳性能不僅需要排除高成本 SQL 語句,而且需要確保相應的物理基礎結構是適當?shù)?。當所有的調(diào)節(jié)旋鈕都設置得恰到好處、內(nèi)存被有效地分配到池和堆而且 I/O 均勻地分配到各個磁盤時,才可得到最佳性能。
不可遺漏的—Lock
這些與鎖相關的控制都是數(shù)據(jù)庫配置參數(shù):
LOCKLIST 表明分配給鎖列表的存儲容量。每個數(shù)據(jù)庫都有一個鎖列表,鎖列表包含了并發(fā)連接到該數(shù)據(jù)庫的所有應用程序所持有的鎖。鎖定是數(shù)據(jù)庫管理器用來控制多個應用程序并發(fā)訪問數(shù)據(jù)庫中數(shù)據(jù)的機制。行和表都可以被鎖定。根據(jù)對象是否還持有其它鎖,每把鎖需要 32 個或 64 個字節(jié)的鎖列表:
需要 64 個字節(jié)來持有某個對象上的鎖,在這個對象上,沒有持有其它鎖。
需要 32 個字節(jié)來記錄某個對象上的鎖,在這個對象上,已經(jīng)持有一個鎖。
MAXLOCKS 定義了應用程序持有的鎖列表的百分比,在數(shù)據(jù)庫管理器執(zhí)行鎖升級之前必須填充該鎖列表。當一個應用程序所使用的鎖列表百分比達到 MAXLOCKS 時,數(shù)據(jù)庫管理器會升級這些鎖,這意味著用表鎖代替行鎖,從而減少列表中鎖的數(shù)量。當任何一個應用程序所持有的鎖數(shù)量達到整個鎖列表大小的這個百分比時,對該應用程序所持有的鎖進行鎖升級。如果鎖列表用完了空間,那么也會發(fā)生鎖升級。數(shù)據(jù)庫管理器通過查看應用程序的鎖列表并查找行鎖最多的表,來決定對哪些鎖進行升級。如果用一個表鎖替換這些行鎖,將不再會超出 MAXLOCKS 值,那么鎖升級就會停止。否則,鎖升級就會一直進行,直到所持有的鎖列表百分比低于 MAXLOCKS。MAXLOCKS 參數(shù)乘以 MAXAPPLS 參數(shù)不能小于 100。
雖然升級過程本身并不用花很多時間,但是鎖定整個表(相對于鎖定個別行)降低了并發(fā)性,而且數(shù)據(jù)庫的整體性能可能會由于對受鎖升級影響的表的后續(xù)訪問而降低。
LOCKTIMEOUT 的缺省值是 -1,這意味著將沒有鎖超時(對 OLTP 應用程序,這種情況可能會是災難性的)。許多 DB2 用戶用 LOCKTIMEOUT = -1。將 LOCKTIMEOUT 設置為很短的時間值,例如 10 或 15 秒。在鎖上等待過長時間會在鎖上產(chǎn)生雪崩效應。
首先,用以下命令檢查 LOCKTIMEOUT 的值:
db2 "get db cfg for DBNAME"
并查找包含以下文本的行:
Lock timeout (sec) (LOCKTIMEOUT) = -1
如果值是 -1,考慮使用以下命令將它更改為 正在看的db2教程是:DB2優(yōu)化(簡易版)。;15 秒(一定要首先詢問應用程序開發(fā)者或供應商以確保應用程序能夠處理鎖超時):
db2 "update db cfg for DBNAME using LOCKTIMEOUT 15"
同時應該監(jiān)視鎖等待的數(shù)量、鎖等待時間和正在使用鎖列表內(nèi)存(lock list memory)的量。請發(fā)出以下命令:
db2 "get snapshot for database on DBNAME"
如果 Lock list memory in use (Bytes) 超過所定義 LOCKLIST 大小的 50%,那么在 LOCKLIST 數(shù)據(jù)庫配置中增加 4k 頁的數(shù)量。
db2 "update monitor switches using
lock ON sort ON bufferpool ON uow ON
table ON statement ON"
打開監(jiān)視開關,獲取需要的性能信息
最簡單而最見成效的—Bufferpool
緩沖池是內(nèi)存中的一塊存儲區(qū)域,用于臨時讀入和更改數(shù)據(jù)庫頁(包含表行或索引項)。緩沖池的用途是為了提高數(shù)據(jù)庫系統(tǒng)的性能。從內(nèi)存訪問數(shù)據(jù)要比從磁盤訪問數(shù)據(jù)快得多。因此,數(shù)據(jù)庫管理器需要從磁盤讀取或寫入磁盤的次數(shù)越少,性能就越好。對一個或多個緩沖池進行配置之所以是調(diào)優(yōu)的最重要方面,是因為連接至數(shù)據(jù)庫的應用程序的大多數(shù)數(shù)據(jù)(不包括大對象和長字段數(shù)據(jù))操作都在緩沖池中進行。
缺省情況下,應用程序使用緩沖池 IBMDEFAULTBP,它是在創(chuàng)建數(shù)據(jù)庫時創(chuàng)建的。當 SYSCAT.BUFFERPOOLS 目錄表中該緩沖池的 NPAGES 值為 -1 時,DB2 數(shù)據(jù)庫配置參數(shù) BUFFPAGE 控制著緩沖池的大小。否則會忽略 BUFFPAGE 參數(shù),并且用 NPAGES 參數(shù)所指定的頁數(shù)創(chuàng)建緩沖池。
建議對于僅使用一個緩沖池的應用程序,將 NPAGES 更改成 -1,這樣 BUFFPAGE 就可以控制該緩沖池的大小。這使得更新和報告緩沖池大小以及其它 DB2 數(shù)據(jù)庫配置參數(shù)變得更加方便。
確保可以使用數(shù)據(jù)庫配置中的 BUFFPAGE 參數(shù)來控制緩沖池大小之后,將該參數(shù)設置成合適的值。根據(jù)數(shù)據(jù)庫的大小和應用程序的性質(zhì)將該參數(shù)設置成一個合理的大值,這種做法很安全。通常,該參數(shù)的缺省值非常小,可能滿足不了要求。
db2 "get snapshot for all bufferpools"
在數(shù)據(jù)庫快照或緩沖池快照的快照輸出中,查找下列"logical reads"和"physical reads",這樣就可以計算出緩沖池命中率,它可以幫助調(diào)優(yōu)緩沖池:
緩沖池命中率表明數(shù)據(jù)庫管理器不需要從磁盤裝入頁(即該頁已經(jīng)在緩沖池中)就能處理頁請求的時間百分比。緩沖池的命中率越高,使用磁盤 I/O 的頻率就越低。按如下計算緩沖池命中率:
(1 - ((buffer pool data physical reads + buffer pool index physical reads) /
(buffer pool data logical reads + pool index logical reads))
) * 100%
這個計算考慮了緩沖池高速緩存的所有頁(索引和數(shù)據(jù))。理想情況下,該比率應當超過 95%,并盡可能接近 100%。要提高緩沖池命中率,請嘗試下面這些方法:
增加緩沖池大小。
考慮分配多個緩沖池,如果可能的話,為每個經(jīng)常被訪問的大表所屬的表空間分配一個緩沖池,為一組小表分配一個緩沖池,然后嘗試一下使用不同大小的緩沖池以查看哪種組合會提供最佳性能。
如果已分配的內(nèi)存不能幫助提高性能,那么請避免給緩沖池分配過多的內(nèi)存。應當根據(jù)取自測試環(huán)境的快照信息來決定緩沖池的大小。
太小的緩沖池會產(chǎn)生過多的、不必要的物理 I/O。太大的緩沖池使系統(tǒng)處在操作系統(tǒng)頁面調(diào)度的風險中并消耗不必要的 CPU 周期來管理過度分配的內(nèi)存。正好合適的緩沖池大小就在"太小"和"太大"之間的某個平衡點上。適當?shù)拇笮〈嬖谟诨貓髮⒁_始減少的點上。
獲得最佳性能的—SQL
一條糟糕的 SQL 語句會徹底破壞一切。一個相對簡單的 SQL 語句也能夠搞糟一個調(diào)整得很好的數(shù)據(jù)庫和機器。對于很多這些語句,天底下(或在文件中)沒有 DB2 UDB 配置參數(shù)能夠糾正因錯誤的 SQL 語句導致的高成本的情況。
更糟糕的是,DBA 常常受到種種束縛:不能更改 SQL(可能是因為它是應用程序供應商提供的)。這給 DBA 只留下三條路可走:
1. 更改或添加索引
2. 更改群集
3. 更改目錄統(tǒng)計信息
健壯的應用程序由成千上萬條不同的 SQL 語句組成。這些語句執(zhí)行的頻率隨應用程序的功能和日常的業(yè)務需要的不同而不同。SQL 語句的實際成本是它執(zhí)行一次的成本乘以它執(zhí)行的次數(shù)。
每個 DBA 所面臨的重大的任務是,識別具有最高"實際成本"的語句的挑戰(zhàn),并且減少這些語句的成本。
通過本機 DB2 Explain 實用程序、一些第三方供應商提供的工具或 DB2 UDB SQL Event Monitor 數(shù)據(jù),可以計算出執(zhí)行一次 SQL 語句所用的資源成本。但是語句執(zhí)行頻率只能通過仔細和耗時地分析 DB2 UDB SQL Event Monitor 的數(shù)據(jù)來了解。
最佳性能不僅需要排除高成本 SQL 語句,而且需要確保相應的物理基礎結構是適當?shù)?。當所有的調(diào)節(jié)旋鈕都設置得恰到好處、內(nèi)存被有效地分配到池和堆而且 I/O 均勻地分配到各個磁盤時,才可得到最佳性能。
不可遺漏的—Lock
這些與鎖相關的控制都是數(shù)據(jù)庫配置參數(shù):
LOCKLIST 表明分配給鎖列表的存儲容量。每個數(shù)據(jù)庫都有一個鎖列表,鎖列表包含了并發(fā)連接到該數(shù)據(jù)庫的所有應用程序所持有的鎖。鎖定是數(shù)據(jù)庫管理器用來控制多個應用程序并發(fā)訪問數(shù)據(jù)庫中數(shù)據(jù)的機制。行和表都可以被鎖定。根據(jù)對象是否還持有其它鎖,每把鎖需要 32 個或 64 個字節(jié)的鎖列表:
需要 64 個字節(jié)來持有某個對象上的鎖,在這個對象上,沒有持有其它鎖。
需要 32 個字節(jié)來記錄某個對象上的鎖,在這個對象上,已經(jīng)持有一個鎖。
MAXLOCKS 定義了應用程序持有的鎖列表的百分比,在數(shù)據(jù)庫管理器執(zhí)行鎖升級之前必須填充該鎖列表。當一個應用程序所使用的鎖列表百分比達到 MAXLOCKS 時,數(shù)據(jù)庫管理器會升級這些鎖,這意味著用表鎖代替行鎖,從而減少列表中鎖的數(shù)量。當任何一個應用程序所持有的鎖數(shù)量達到整個鎖列表大小的這個百分比時,對該應用程序所持有的鎖進行鎖升級。如果鎖列表用完了空間,那么也會發(fā)生鎖升級。數(shù)據(jù)庫管理器通過查看應用程序的鎖列表并查找行鎖最多的表,來決定對哪些鎖進行升級。如果用一個表鎖替換這些行鎖,將不再會超出 MAXLOCKS 值,那么鎖升級就會停止。否則,鎖升級就會一直進行,直到所持有的鎖列表百分比低于 MAXLOCKS。MAXLOCKS 參數(shù)乘以 MAXAPPLS 參數(shù)不能小于 100。
雖然升級過程本身并不用花很多時間,但是鎖定整個表(相對于鎖定個別行)降低了并發(fā)性,而且數(shù)據(jù)庫的整體性能可能會由于對受鎖升級影響的表的后續(xù)訪問而降低。
LOCKTIMEOUT 的缺省值是 -1,這意味著將沒有鎖超時(對 OLTP 應用程序,這種情況可能會是災難性的)。許多 DB2 用戶用 LOCKTIMEOUT = -1。將 LOCKTIMEOUT 設置為很短的時間值,例如 10 或 15 秒。在鎖上等待過長時間會在鎖上產(chǎn)生雪崩效應。
首先,用以下命令檢查 LOCKTIMEOUT 的值:
db2 "get db cfg for DBNAME"
并查找包含以下文本的行:
Lock timeout (sec) (LOCKTIMEOUT) = -1
如果值是 -1,考慮使用以下命令將它更改為 正在看的db2教程是:DB2優(yōu)化(簡易版)。;15 秒(一定要首先詢問應用程序開發(fā)者或供應商以確保應用程序能夠處理鎖超時):
db2 "update db cfg for DBNAME using LOCKTIMEOUT 15"
同時應該監(jiān)視鎖等待的數(shù)量、鎖等待時間和正在使用鎖列表內(nèi)存(lock list memory)的量。請發(fā)出以下命令:
db2 "get snapshot for database on DBNAME"
如果 Lock list memory in use (Bytes) 超過所定義 LOCKLIST 大小的 50%,那么在 LOCKLIST 數(shù)據(jù)庫配置中增加 4k 頁的數(shù)量。
本新聞共2頁,當前在第1頁 1 2
相關文章
Db2數(shù)據(jù)庫中常見的堵塞問題分析與處理方法
IBM的DB2是關系數(shù)據(jù)庫的鼻祖,最近更加的深入了學習了,所以下面這篇文章主要給大家介紹了關于Db2數(shù)據(jù)庫中常見的堵塞問題分析與處理方法,文中通過示例代碼介紹的非常詳細,需要的朋友們下面來一起看看吧。2018-04-04