統(tǒng)計值更新--runstats
調(diào)整Buffer pool
調(diào)整日志緩沖區(qū)大小
應(yīng)用程序堆大小
排序堆大小和排序堆值
代理程序的數(shù)目
鎖
活動應(yīng)用程序的最大數(shù)目
頁清除程序的數(shù)目
I/O服務(wù)器的數(shù)目
編入組的提交數(shù)目
統(tǒng)計信息更新
當(dāng)對SQL 查詢進(jìn)行優(yōu)化時,SQL 編譯器所做出的決定會受到優(yōu)化器
的數(shù)據(jù)庫內(nèi)容模型的重大影響。
優(yōu)化器使用該數(shù)據(jù)模型來估計可以用于解決某個特定查詢的其它存取
路徑的成本。
數(shù)據(jù)模型中的關(guān)鍵元素是一組統(tǒng)計信息,該統(tǒng)計信息收集了有關(guān)數(shù)據(jù)
庫中所包含的數(shù)據(jù)和系統(tǒng)目錄表中所存儲的數(shù)據(jù)的信息。這包括表、
別名(nickname)、索引、列和用戶定義的函數(shù)(UDF)的統(tǒng)計信
息。
優(yōu)化器根據(jù)這些統(tǒng)計信息決定最有效方法訪問數(shù)據(jù)的方法,數(shù)據(jù)統(tǒng)計
信息中的變化會引起對存取方案的選擇發(fā)生變化。
適時更新數(shù)據(jù)統(tǒng)計信息。
統(tǒng)計信息更新
適時更新數(shù)據(jù)統(tǒng)計信息。
–當(dāng)向表裝入數(shù)據(jù)并創(chuàng)建了合適的索引時。
–當(dāng)用REORG 實用程序重新組織表時。
–當(dāng)存在大量影響表及其索引的更新、刪除和插入操作時。(此處的“大量”可能意味
著10% 到20% 的表和索引數(shù)據(jù)都受到了影響。)
–在綁定性能至關(guān)重要的應(yīng)用程序之前。
–當(dāng)預(yù)取數(shù)量發(fā)生變化時。
只有當(dāng)進(jìn)行顯式的請求時,對象的統(tǒng)計信息才會在系統(tǒng)目錄表中被更新。更新
部分或全部統(tǒng)計信息方法:
–使用RUNSTATS(運行統(tǒng)計信息,run statistics)實用程序。
–使用“reorgchk update statistics”命令。
在使用RUNSTATS 之后需要重新綁定使用靜態(tài)SQL 的應(yīng)用程序,使查詢優(yōu)
化器就可以選擇新統(tǒng)計信息所給出的最佳存取方案。但是,對于使用動態(tài)SQL
的應(yīng)用程序而言,沒必要進(jìn)行重新綁定,因為語句的優(yōu)化是根據(jù)統(tǒng)計信息在運
行時進(jìn)行的。
reorgchk update statistics
當(dāng)您不完全知道所有表名或表名實在太多時,進(jìn)行RUNSTATS 的最簡單方
法就是使用“db2 reorgchk update statistics”命令。
正確的腳本如下:
db2 -v connect to DB_NAME
db2 -v "select tbname, nleaf, nlevels, stats_timefrom sysibm.sysindexes“
db2 -v reorgchk update statistics on table all
db2 -v "select tbname, nleaf, nlevels, stats_timefrom sysibm.sysindexes“
db2 -v terminate
Runstats實用程序
如果您知道表名并且想避免對大量表運行RUNSTATS 實用程序(因
為這樣做可能要花很長時間),那么一次對一張表進(jìn)行RUNSTATS
更為可取。
命令如下:
db2 -v runstats on table TAB_NAME and indexes all
這個命令將收集該表及其所有索引(基本級別)的統(tǒng)計信息。
要查看是否對數(shù)據(jù)庫執(zhí)行了RUNSTATS,一種快捷方法便是查詢一
些系統(tǒng)目錄表。例如:
db2 -v "select tbname, nleaf, nlevels, stats_timefrom
sysibm.sysindexes"
調(diào)整Bufferpool大小
緩沖池是內(nèi)存中的一塊存儲區(qū)域,用于臨時讀入和更改數(shù)據(jù)頁(含表行或索引
項)。緩沖池的用途是為了提高數(shù)據(jù)庫系統(tǒng)的性能。
缺省情況下,應(yīng)用程序使用緩沖池IBMDEFAULTBP,它是在創(chuàng)建數(shù)據(jù)庫時創(chuàng)
建的。當(dāng)SYSCAT.BUFFERPOOLS 目錄表中該緩沖池的NPAGES 值為-1
時,DB2 數(shù)據(jù)庫配置參數(shù)BUFFPAGE 控制著緩沖池的大小。
可以增大所有數(shù)據(jù)庫的BUFFPAGE 值。
db2 -v connect to DB_NAME
db2 -v select * from syscat.bufferpools
db2 -v alter bufferpool IBMDEFAULTBP size -1
db2 -v connect reset
db2 -v update db cfg for dbname using BUFFPAGE bigger_value
db2 -v terminate
要確定數(shù)據(jù)庫的緩沖池大小是否由BUFFPAGE 參數(shù)所決定,運行:
db2 -v connect to DB_NAME
db2 -v SELECT * from SYSCAT.BUFFERPOOLS
db2 -v connect reset
db2 -v terminate
檢查結(jié)果。如果每個緩沖池都有一個為“-1”的NPAGES 值,那么緩沖池大小是
由數(shù)據(jù)庫配置中的BUFFPAGE 參數(shù)控制的。
調(diào)整Bufferpool大小(續(xù))
要確定緩沖池大小是否足夠大,請在運行應(yīng)用程序時收集數(shù)據(jù)庫和/
或緩沖池的快照。下面的腳本為您提供這些所需的信息:
db2 -v update monitor switches using bufferpool on
db2 -v get monitor switches
--運行程序–
db2 -v get snapshot for all databases > snap.out
db2 -v get snapshot for dbm>> snap.out
db2 -v get snapshot for all bufferpools>> snap.out
db2 -v reset monitor all
db2 -v terminate
請確保您在斷開數(shù)據(jù)庫連接之前發(fā)出“db2 -v get snapshot”,否則,該
數(shù)據(jù)庫停止運行,同時所有快照統(tǒng)計信息將會丟失。
調(diào)整Bufferpool大小(續(xù))
在數(shù)據(jù)庫快照或緩沖池快照的快照輸出中,查找下列“logical reads”和“physical
reads”,這樣就可以計算出緩沖池命中率,它可以幫助您調(diào)優(yōu)緩沖池:
--Related lines from a sample of bufferpoolsnapshots –
Buffer pool data logical reads = 702033
Buffer pool data physical reads = 0
Buffer pool data writes = 414
Buffer pool index logical reads = 168255
Buffer pool index physical reads = 0
按如下計算緩沖池命中率:
(1 -((buffer pool data physical reads + buffer pool index physical reads)
/(buffer pool data logical reads + pool index logical reads))) *100%
這個計算考慮了緩沖池高速緩存的所有頁(索引和數(shù)據(jù))。理想情況下,該比
率應(yīng)當(dāng)超過95%,并盡可能接近100%。
要提高緩沖池命中率,請嘗試下面這些方法:
–增加緩沖池大小。如果您的機器上有足夠大的內(nèi)存,請將BUFFPAGE 設(shè)置成
40000 個頁(160 MB),或者等于機器總內(nèi)存的10%。對于大型OLTP 數(shù)據(jù)庫,在
保持系統(tǒng)穩(wěn)定的同時為緩沖池留出盡可能多的內(nèi)存。可以先嘗試使用1.6 GB 的內(nèi)
存,然后嘗試用更多內(nèi)存。
–考慮分配多個緩沖池,如果可能的話,為每個經(jīng)常被訪問的大表所屬的表空間分配一
個緩沖池,為一組小表分配一個緩沖池,然后嘗試一下使用不同大小的緩沖池以查看
哪種組合會提供最佳性能。表空間的頁大小與緩沖池的頁大小一樣。
調(diào)整Bufferpool大小(續(xù))
create db testdb
--using codesetiso8859-1 territory US
on /data/misserver/dbimages
collate using identity
dft_extent_sz8
catalog tablespace managed by database
using (device '/dev/rds01' 131072,
device '/dev/rds02' 131072,
device '/dev/rds03' 131072)
extentsize 32 prefetchsize 96
;
connect to testdb;
create bufferpool databp size 25000 pagesize 32768;
create bufferpool bp8k size 16 pagesize 8192;
disconnect all;
調(diào)整Bufferpool大小(續(xù))
create tablespace datatblsp pagesize 32K
managed by database
using (
device '/dev/rdata0' 30720M ,
device '/dev/rdata1' 30720M ,
)
extentsize 8 prefetchsize 48
bufferpool databp;
create tablespace idxtblsp pagesize 32K
managed by database
using (
device '/dev/ridxa0' 6144M ,
device '/dev/ridxa1' 6144M ,
)
extentsize 8 prefetchsize 48
bufferpool databp;
調(diào)整日志緩沖區(qū)
LOGBUFSZ 是一個數(shù)據(jù)庫配置參數(shù)。它是用于日志緩沖區(qū)的參數(shù)。
它允許您指定數(shù)據(jù)庫共享內(nèi)存的大小以用作在將日志記錄寫到磁盤之
前這些記錄的緩沖區(qū)。
當(dāng)下列事件之一發(fā)生時會將日志記錄寫到磁盤:
–事務(wù)提交。
–日志緩沖區(qū)已滿。
–其它某個內(nèi)部數(shù)據(jù)庫管理器事件發(fā)生時。
將日志記錄存在緩沖區(qū)將產(chǎn)生更加有效的日志文件I/O。如果對專用
的日志磁盤有相當(dāng)多的讀操作,或者希望有較高的磁盤利用率,那么
可以增加這個緩沖區(qū)的大小。
當(dāng)增加這個參數(shù)的值時,也要考慮DBHEAP 參數(shù),日志緩沖區(qū)使用
的空間由DBHEAP 參數(shù)所控制。
調(diào)整日志緩沖區(qū)
LOGBUFSZ 是一個數(shù)據(jù)庫配置參數(shù)。它是用于日志緩沖區(qū)的參數(shù)。
它允許您指定數(shù)據(jù)庫共享內(nèi)存的大小以用作在將日志記錄寫到磁盤之
前這些記錄的緩沖區(qū)。
當(dāng)下列事件之一發(fā)生時會將日志記錄寫到磁盤:
–事務(wù)提交。
–日志緩沖區(qū)已滿。
–其它某個內(nèi)部數(shù)據(jù)庫管理器事件發(fā)生時。
將日志記錄存在緩沖區(qū)將產(chǎn)生更加有效的日志文件I/O。如果對專用
的日志磁盤有相當(dāng)多的讀操作,或者希望有較高的磁盤利用率,那么
可以增加這個緩沖區(qū)的大小。
當(dāng)增加這個參數(shù)的值時,也要考慮DBHEAP 參數(shù),日志緩沖區(qū)使用
的空間由DBHEAP 參數(shù)所控制。
調(diào)整日志緩沖區(qū)(續(xù))
LOGBUFSZ的缺省值為8(4KB 頁),這對于OLTP 數(shù)據(jù)庫而言通
常不夠大。LOGBUFSZ 的最佳值為128 個或256 個4KB 頁。
可以使用下面這個命令來更改該參數(shù)值:
db2 -v update database cfg for DB_NAME using LOGBUFSZ 256
db2 -v terminate
使用數(shù)據(jù)庫快照來確定LOGBUFSZ 參數(shù)的值是否為最佳值:
Log pages read = 0
Log pages written = 12644
一般而言,“log pages read”和“log pages written”之比應(yīng)當(dāng)盡可能
小。理想情況下,“log pages read”的值應(yīng)為0,而“log pages written”
的值應(yīng)很大。當(dāng)log pages read 太多時,意味著需要一個較大的
LOGBUFSZ。
調(diào)整應(yīng)用程序堆大小(APPHEAPSZ)
APPHEAPSZ 是一個數(shù)據(jù)庫配置參數(shù),它定義了代表某個特定代理程
序或子代理程序的數(shù)據(jù)庫管理器可以使用的私有內(nèi)存頁數(shù)。
在為應(yīng)用程序初始化代理程序或子代理程序時分配堆。
分配的堆大小是處理給予代理程序或子代理程序的請求所需的最小
值。當(dāng)代理程序或子代理程序需要更多的堆空間以處理較大的SQL
語句時,數(shù)據(jù)庫管理器將按照需要分配內(nèi)存,所分配的內(nèi)存大小最大
可達(dá)到該參數(shù)所指定的最大值。
缺省值是128 個4KB 頁,更改命令是:
db2 -v update db cfg for DB_NAME using applheapsz 256
db2 -v terminate
當(dāng)應(yīng)用程序接收到一個表明應(yīng)用程序堆中存儲空間不夠的錯誤時,應(yīng)
該增加APPHEAPSZ 的值。
排序堆大小(SORTHEAP)和排序堆閾值(SHEAPTHRES)
SORTHEAP 是一個數(shù)據(jù)庫配置參數(shù),它定義了私有排序所使用的私有內(nèi)存頁的
最大數(shù)目,或共享排序所使用的共享內(nèi)存頁的最大數(shù)目。如果排序是私有排
序,那么該參數(shù)影響代理程序私有內(nèi)存。如果排序是共享排序,那么該參數(shù)影
響數(shù)據(jù)庫的共享內(nèi)存。每個排序都有單獨的由數(shù)據(jù)庫管理器按需分配的排序
堆,在排序堆中對數(shù)據(jù)進(jìn)行排序。如果由優(yōu)化器來指導(dǎo)排序堆大小的分配,那
么用優(yōu)化器提供的信息來分配的排序堆的大小要小于由該參數(shù)所指定的排序堆
大小。
SHEAPTHRES 是一個數(shù)據(jù)庫管理器配置參數(shù)。私有和共享排序所使用內(nèi)存的
來源不一樣。共享排序內(nèi)存區(qū)的大小是在第一次連接到數(shù)據(jù)庫時根據(jù)
SHEAPTHRES 值以靜態(tài)方式預(yù)先確定的。私有排序內(nèi)存區(qū)的大小是不受限制
的。
對于私有排序和共享排序,應(yīng)用SHEAPTHRES 參數(shù)的方式不同:
–對于私有排序,SHEAPTHRES 是對私有排序在任何給定的時間可以消耗的全部內(nèi)
存的實例級“軟”限制。當(dāng)實例的總私有排序內(nèi)存消耗量達(dá)到這一限制時,為其它進(jìn)入
的私有排序請求而分配的內(nèi)存會大大減少。
–對于共享排序,SHEAPTHRES 是對共享排序在任何給定的時間可以消耗的全部內(nèi)
存的數(shù)據(jù)庫級“硬”限制。當(dāng)達(dá)到這一限制時,不允許有其它共享排序內(nèi)存請求,直到
總的共享內(nèi)存消耗量回落到SHEAPTHRES 所指定的限制以下。
排序堆大小(SORTHEAP)和排序堆閾值(SHEAPTHRES)
要更改SORTHEAP 和SHEAPTHRES 的值,可以運行如下命令:
db2 -v update db cfg for DB_NAME using SORTHEAP a_value
db2 -v update dbmcfgusing SHEAPTHRES b_value
db2 -v terminate
SORTHEAP是針對單個數(shù)據(jù)庫的,SHEAPTHRES是針對數(shù)據(jù)庫例程
的。
排序堆大小(SORTHEAP)和排序堆閾值(SHEAPTHRES)
OLTP 應(yīng)用程序不應(yīng)該執(zhí)行大型排序,通常,SORTHEAP 大小的缺省值(256
個4KB 頁)就足夠了。事實上,對于高并發(fā)性O(shè)LTP,您可能希望降低這個缺
省值。
當(dāng)需要進(jìn)一步研究時,可以發(fā)出下面這條命令:
db2 -v update monitor switches using sort on
然后,讓您的應(yīng)用程序運行一會,然后輸入:
db2 -v get snapshot for database on DBNAME
看一下下面這個示例中的輸出:
Total sort heap allocated = 0
Total sorts = 1
Total sort time (ms) = 0
Sort overflows = 0
Active sorts = 0
Commit statements attempted = 1
Rolback statements attempted = 0
Dynamic statements attempted = 4
Static statements attempted = 1
Binds/precompilesattempted = 0
排序堆大小(SORTHEAP)和排序堆閾值(SHEAPTHRES)
根據(jù)該輸出,計算每個事務(wù)的排序數(shù)目、計算溢出了可用于排序的內(nèi)
存的那部分排序的百分比。
SortsPerTransaction= (Total Sorts) / (Commit statements attempted +
Rollback statements attempted)
PercentSortOverflow= (Sort overflows * 100 ) / (Total sorts)
如果SortsPerTransaction大于5,它可能表明每個事務(wù)的排序太多。
如果PercentSortOverflow大于3%,那么可能發(fā)生了嚴(yán)重的、未曾預(yù)
料到的大型排序。發(fā)生這種情況時,增加SORTHEAP 只會隱藏性能
問題-卻無法修正它。這個問題的正確解決方案是通過添加正確的索
引改進(jìn)有問題的SQL 語句的存取方案。
排序堆大小(SORTHEAP)和排序堆閾值(SHEAPTHRES)
建議:
使用合適的索引使排序堆的使用降到最低。
當(dāng)需要頻繁進(jìn)行大型排序時,增加SORTHEAP 的值。
如果增加SORTHEAP,請確定是否還需要調(diào)整數(shù)據(jù)庫管理器配置文件
中的SHEAPTHRES 參數(shù)。
優(yōu)化器用排序堆大小來確定存取路徑。在更改該參數(shù)后請考慮重新綁
定應(yīng)用程序(使用REBIND PACKAGE 命令)。
理想情況下,應(yīng)當(dāng)將排序堆閾值(SHEAPTHRES)參數(shù)合理地設(shè)置為
在數(shù)據(jù)庫管理器實例中設(shè)置的SORTHEAP 參數(shù)最大值的倍數(shù)。該參
數(shù)至少應(yīng)當(dāng)是實例中任何數(shù)據(jù)庫所定義的最大SORTHEAP 的兩倍。
代理程序的數(shù)目(MAXAGENTS、NUM_POOLAGENTS 和NUM_INITAGENTS)
這些是數(shù)據(jù)庫管理器配置參數(shù)。
MAXAGENTS 參數(shù)表明在任何給定時間接受應(yīng)用程序請求的數(shù)據(jù)庫管理器代理
程序的最大數(shù)目。MAXAGENTS 的值應(yīng)當(dāng)至少是每個被并發(fā)地訪問的數(shù)據(jù)庫中
的MAXAPPLS(并發(fā)應(yīng)用程序最大數(shù)目)值的總和。如果數(shù)據(jù)庫的數(shù)量大于
NUMDB 參數(shù),那么最安全的方案就是使用NUMDB 和MAXAPPLS 最大值的乘
積。
NUM_POOLAGENTS 參數(shù)是用于評定您希望代理程序池增加到多大的準(zhǔn)則。如
果所創(chuàng)建的代理程序多于該參數(shù)值所指明的數(shù)目,那么當(dāng)代理程序執(zhí)行完自己當(dāng)
前的請求后將終止運行而不是返回給代理程序池。如果該參數(shù)的值為0,將按照
需要創(chuàng)建代理程序,在代理程序執(zhí)行完自己當(dāng)前的請求后終止運行。
要避免因在并發(fā)連接許多應(yīng)用程序的OLTP 環(huán)境中頻繁創(chuàng)建和終止代理程序而產(chǎn)
生的成本,請將NUM_POOLAGENTS 的值增加到接近MAXAGENTS 值。
NUM_INITAGENTS 參數(shù)決定空閑代理程序的初始數(shù)量,這些代理程序是在
DB2START 時在代理程序池中創(chuàng)建的。指定初始代理程序數(shù)目要合適。
在大多數(shù)情況下,將MAXAGENTS 和NUM_POOLAGENTS 的值設(shè)置成略微大
于并發(fā)應(yīng)用程序連接的最大預(yù)計數(shù)目。NUM_INITAGENTS 保留為缺省值。
代理程序的數(shù)目(MAXAGENTS、NUM_POOLAGENTS 和NUM_INITAGENTS)
更改這些參數(shù)的命令:
db2 -v update dbm cfg using MAXAGENTS a_value
db2 -v update dbm cfg using NUM_POOLAGENTS b_value
db2 -v update dbm cfg using NUM_INITAGENTS c_value
db2 -v terminate
代理程序的數(shù)目(MAXAGENTS、NUM_POOLAGENTS 和NUM_INITAGENTS)
在運行期間的任何時候,您都可以使用下面這個命令來獲取數(shù)據(jù)庫管理
器的快照數(shù)據(jù):
db2 -v get snapshot for dbm
看一下下列輸出行:
High water mark for agents registered = 4
High water mark for agents waiting for a token = 0
Agents registered = 4Agents waiting for a token = 0
Idle agents = 0
Agents assigned from pool = 5
Agents created from empty pool = 4
Agents stolen from another application = 0
High water mark for coordinating agents = 4
Max agents overflow = 0
如果發(fā)現(xiàn)“Agents waiting for a token”或“Agents stolen from another
application”不等于0,則可能需要增加MAXAGENTS 以允許數(shù)據(jù)庫管
理器可以使用更多的代理程序。
鎖(LOCKLIST、MAXLOCKS 和LOCKTIMEOUT)
這些與鎖相關(guān)的控制都是數(shù)據(jù)庫配置參數(shù)。
LOCKLIST 表明分配給鎖列表的存儲容量。每個數(shù)據(jù)庫都有一個鎖列表,鎖定
是數(shù)據(jù)庫管理器用來控制多個應(yīng)用程序并發(fā)訪問數(shù)據(jù)庫中數(shù)據(jù)的機制。行和表
都可以被鎖定。根據(jù)對象是否還持有其它鎖,每把鎖需要32 個或64 個字節(jié)
的鎖列表:
–需要64 個字節(jié)來持有某個對象上的鎖,在這個對象上,沒有持有其它鎖。
–需要32 個字節(jié)來記錄某個對象上的鎖,在這個對象上,已經(jīng)持有一個鎖。
MAXLOCKS 定義了應(yīng)用程序持有的鎖列表的百分比,在數(shù)據(jù)庫管理器執(zhí)行鎖
升級之前必須填充該鎖列表。當(dāng)一個應(yīng)用程序所使用的鎖列表百分比達(dá)到
MAXLOCKS 時,數(shù)據(jù)庫管理器會升級這些鎖,這意味著用表鎖代替行鎖,從
而減少列表中鎖的數(shù)量。當(dāng)任何一個應(yīng)用程序所持有的鎖數(shù)量達(dá)到整個鎖列表
大小的這個百分比時,對該應(yīng)用程序所持有的鎖進(jìn)行鎖升級。如果用一個表鎖
替換這些行鎖,將不再會超出MAXLOCKS 值,那么鎖升級就會停止。否則,
鎖升級就會一直進(jìn)行,直到所持有的鎖列表百分比低于MAXLOCKS。
MAXLOCKS 參數(shù)乘以MAXAPPLS 參數(shù)不能小于100。
雖然升級過程本身并不用花很多時間,但是鎖定整個表(相對于鎖定個別行)
降低了并發(fā)性,而且數(shù)據(jù)庫的整體性能可能會由于對受鎖升級影響的表的后續(xù)
訪問而降低。
鎖(LOCKLIST、MAXLOCKS 和LOCKTIMEOUT)
使用下列步驟確定鎖列表所需的頁數(shù):
–計算鎖列表大小的下限:(512 * 32 * MAXAPPLS) / 4096,其中512 是
每個應(yīng)用程序平均所含鎖數(shù)量的估計值,32 是對象(已有一把鎖)上每
把鎖所需的字節(jié)數(shù)。
–計算鎖列表大小的上限:(512 * 64 * MAXAPPLS) / 4096,其中64 是某
個對象上第一把鎖所需的字節(jié)數(shù)。
–對于您的數(shù)據(jù),估計可能具有的并發(fā)數(shù),并根據(jù)您的預(yù)計為鎖列表選擇
一個初始值,該值位于您計算出的上限和下限之間。
使用數(shù)據(jù)庫系統(tǒng)監(jiān)視器調(diào)優(yōu)MAXLOCKS 值。
設(shè)置MAXLOCKS 時,請考慮鎖列表的大小(LOCKLIST):
–MAXLOCKS = 100 * (512 鎖/應(yīng)用程序* 32 字節(jié)/鎖* 2) /
(LOCKLIST * 4096 字節(jié))
–該樣本公式允許任何應(yīng)用程序持有的鎖是平均數(shù)的兩倍。如果只有幾個
應(yīng)用程序并發(fā)地運行,則可以增大MAXLOCKS,因為在這些條件下鎖
列表空間中不會有太多爭用。
鎖(LOCKLIST、MAXLOCKS 和LOCKTIMEOUT)
LOCKTIMEOUT 指定了應(yīng)用程序為獲取鎖所等待的秒數(shù)。這有助于
應(yīng)用程序避免全局死鎖。
如果將該參數(shù)設(shè)置成0,那么應(yīng)用程序?qū)⒉坏却@取鎖。在這種情形
中,如果請求時沒有可用的鎖,那么應(yīng)用程序立刻會接收到-911。
如果將該參數(shù)設(shè)置成-1,那么將關(guān)閉鎖超時檢測。在這種情形中,
應(yīng)用程序?qū)⒌却@取鎖(如果請求時沒有可用的鎖),一直到被授
予了鎖或出現(xiàn)死鎖為止。
在聯(lián)機事務(wù)處理(OLTP)環(huán)境中,這個值從30 秒開始。在只進(jìn)行
查詢的環(huán)境中可以從一個更大的值開始。
鎖(LOCKLIST、MAXLOCKS 和LOCKTIMEOUT)
更改鎖參數(shù)的命令:
db2 -v update db cfg for DB_NAME using LOCKLIST a_number
db2 -v update db cfg for DB_NAME using MAXLOCKS b_number
db2 -v update db cfg for DB_NAME using LOCKTIMEOUT c_number
db2 -v terminate
鎖(LOCKLIST、MAXLOCKS 和LOCKTIMEOUT)
使用數(shù)據(jù)庫系統(tǒng)監(jiān)視器來確定是否發(fā)生鎖升級,跟蹤應(yīng)用程序(連接)遭遇鎖超時
的次數(shù),或者數(shù)據(jù)庫檢測到的所有已連接應(yīng)用程序的超時情形。
首先,運行下面這個命令以打開針對鎖的DB2 監(jiān)視器:
db2 -v update monitor switches using lock ondb2 -v terminate
然后收集數(shù)據(jù)庫快照:
db2 -v get snapshot for database on DB_NAME
在快照輸出中,檢查下列各項:
Locks held currently = 0
Lock waits = 0
Time database waited on locks (ms) = 0
Lock list memory in use (Bytes) = 504
Deadlocks detected = 0
Lock escalations = 0
Exclusive lock escalations = 0
Agents currently waiting on locks = 0
Lock Timeouts = 0
Internal rollbacks due to deadlock = 0
如果“Lock list memory in use (Bytes)”超過定義的LOCKLIST 大小的50%,那么就
增加LOCKLIST 的數(shù)量。鎖升級、鎖超時和死鎖將表明系統(tǒng)或應(yīng)用程序中存在某
些潛在問題。
鎖定問題通常表明應(yīng)用程序中存在一些相當(dāng)嚴(yán)重的并發(fā)性問題,在增大鎖列表參數(shù)
的值之前應(yīng)當(dāng)解決這些問題。
活動應(yīng)用程序的最大數(shù)目(MAXAPPLS)
MAXAPPLS 是一個數(shù)據(jù)庫配置參數(shù)。它指定了可以連接到數(shù)據(jù)庫的
并發(fā)應(yīng)用程序(本地和遠(yuǎn)程)的最大數(shù)量。
該參數(shù)值必須大于等于已連接應(yīng)用程序的數(shù)量,加上這些相同的應(yīng)用
程序中完成兩階段提交或回滾過程中可能并發(fā)存在的數(shù)量的總和。
在OLTP 應(yīng)用中,請確保將MAXAPPLS 的值設(shè)置正確,以容納最多
的并發(fā)用戶/連接。
對于那些使用連接池的應(yīng)用程序,可以將MAXAPPLS 的值設(shè)置成比
連接池的大小大1 或2(這樣做只是為了以防需要調(diào)用命令行連接來
同時做一些事情)。
活動應(yīng)用程序的最大數(shù)目(MAXAPPLS)
更改MAXAPPLS 值的命令:
db2 -v update db cfgfor DB_NAME using MAXAPPLS a_number
db2 -v terminate
當(dāng)應(yīng)用程序嘗試連接數(shù)據(jù)庫,但是連接到數(shù)據(jù)庫的應(yīng)用程序數(shù)已經(jīng)達(dá)
到了MAXAPPLS 的值時,會向應(yīng)用程序返回下面這個錯誤,表明連
接到該數(shù)據(jù)庫的應(yīng)用程序數(shù)已達(dá)到了最大值。
SQL1040N The maximum number of applications is already
connected to thedatabase. SQLSTATE=57030
異步頁清除程序的數(shù)量(NUM_IOCLEANERS)
NUM_IOCLEANERS 是一個數(shù)據(jù)庫配置參數(shù),指定數(shù)據(jù)庫的異步頁
清除程序的數(shù)目。在數(shù)據(jù)庫代理程序需要緩沖池中的空間之前,這些
頁清除程序?qū)⒕彌_池中已更改的頁寫到磁盤,這允許代理程序不必等
待已更改頁被寫到磁盤就可以讀取新頁,提高應(yīng)用系統(tǒng)性能。
如果將該參數(shù)設(shè)置成0,則不啟動頁清除程序,結(jié)果,數(shù)據(jù)庫代理程
序?qū)⒕彌_池中的所有頁寫到磁盤。該參數(shù)會對存儲在多個物理存儲設(shè)
備上的單個數(shù)據(jù)庫的性能產(chǎn)生顯著影響,因為在這種情況下其中某個
設(shè)備極有可能處于空閑狀態(tài)。如果沒有配置頁清除程序,則應(yīng)用程序
可能會遇到不時發(fā)生的“日志已滿”情況。
如果連接到數(shù)據(jù)庫的應(yīng)用程序主要執(zhí)行更新數(shù)據(jù)的事務(wù),那么增加清
除程序的數(shù)目會提高性能。
增加頁清除程序的數(shù)量還會減少“軟”故障(比如斷電)的恢復(fù)時間,
因為磁盤上數(shù)據(jù)庫的內(nèi)容在任何給定時候都是比較新的。
異步頁清除程序的數(shù)量(NUM_IOCLEANERS)
設(shè)置該參數(shù)時要考慮的因素:
–如果有多個事務(wù)針對數(shù)據(jù)庫運行,則將該參數(shù)的值設(shè)置在1 到該數(shù)據(jù)庫
所使用的物理存儲器的數(shù)量之間。
–至少將該參數(shù)的值設(shè)置成您系統(tǒng)上CPU 的數(shù)量。
–在具有高更新事務(wù)率的環(huán)境下,可能需要配置較多的頁清除程序。
–在具有大緩沖池的環(huán)境下,也可能需要配置較多的頁清除程序。
異步頁清除程序的數(shù)量(NUM_IOCLEANERS)
更改該參數(shù)的命令:
db2 -v update db cfg for DB_NAME using NUM_IOCLEANERS a_number
db2 -v terminate
使用數(shù)據(jù)庫系統(tǒng)監(jiān)視器,利用有關(guān)從緩沖池進(jìn)行寫操作的快照數(shù)據(jù)(或
事件監(jiān)視器)信息來幫助您調(diào)優(yōu)該配置參數(shù)。
當(dāng)使用快照和收集緩沖池的快照數(shù)據(jù)時,監(jiān)控下列計數(shù)器:
Buffer pool data writes = 0
Asynchronous pool data page writes = 0
Buffer pool index writes = 0
Asynchronous pool index page writes = 0
LSN Gap cleaner triggers = 0
Dirty page steal cleaner triggers = 0
Dirty page threshold cleaner triggers = 0
異步頁清除程序的數(shù)量(NUM_IOCLEANERS)
如果下面這兩個條件成立,減少NUM_IOCLEANERS:
“Buffer pool data writes”約等于“Asynchronous pool data page writes”。
“Buffer pool index writes”約等于“Asynchronous pool index page writes”。
只要下面這兩個條件有一個成立,增加NUM_IOCLEANERS:
“Buffer pool data writes”遠(yuǎn)遠(yuǎn)大于“Asynchronous pool data page writes”。
“Buffer pool index writes”遠(yuǎn)遠(yuǎn)大于“Asynchronous pool index page writes”。
Dirty page steal cleaner triggers 指出調(diào)用頁清除程序的次數(shù),為了有更好的響應(yīng)
時間,該數(shù)值應(yīng)當(dāng)盡可能低。利用上面所示的計數(shù)器,可以使用下面的公式計算用
該元素表示的所有清除程序調(diào)用的百分比:
Dirty page steal cleaner triggers / (Dirty page steal cleaner triggers +
Dirty page threshold cleaner triggers +
LSN Gap cleaner triggers)
如果該比率很高,則它可能表明您所定義的頁清除程序太少了。
I/O 服務(wù)器的數(shù)目(NUM_IOSERVERS)
該參數(shù)是一個數(shù)據(jù)庫配置參數(shù),用于指定數(shù)據(jù)庫的I/O 服務(wù)器的數(shù)目。
諸如備份和恢復(fù)之類的實用程序使用I/O 服務(wù)器代表數(shù)據(jù)庫代理程序執(zhí)行
預(yù)取I/O 和異步I/O。
超過這個數(shù)量的預(yù)取和實用程序I/O 在任何時候都不能在數(shù)據(jù)庫中運行。
在啟動I/O 操作時,I/O 服務(wù)器處于等待狀態(tài)。
由于從數(shù)據(jù)庫代理程序直接調(diào)度非預(yù)取I/O,因此非預(yù)取I/O 不受
NUM_IOSERVERS 約束。
在OLTP 環(huán)境中,使用缺省值就可以。
更改NUM_IOSERVERS參數(shù)的命令:
db2 -v update db cfg for DB_NAME using NUM_IOSERVERS a_number
db2 -v terminate
編入組的提交數(shù)目(MINCOMMIT)
MINCOMMIT 是數(shù)據(jù)庫配置參數(shù),它讓您把將日志記錄寫到磁盤的工
作一直延遲到執(zhí)行了最小數(shù)量的提交為止。
該延遲有助于減少與寫日志記錄相關(guān)的數(shù)據(jù)庫管理器開銷。這意味著
當(dāng)您針對數(shù)據(jù)庫運行多個應(yīng)用程序并且在非常短的時間范圍內(nèi)應(yīng)用程
序請求大量提交時可以提高性能。
只有當(dāng)該參數(shù)值大于1 并且當(dāng)連接到數(shù)據(jù)庫的應(yīng)用程序數(shù)量大于或等
于該參數(shù)值時,才會發(fā)生這個提交分組。
當(dāng)執(zhí)行提交分組時,應(yīng)用程序提交請求會被掛起,直到時間過去1 秒
或提交請求的數(shù)量等于該參數(shù)值。
使用下面的命令更改MINCOMMIT 值:
db2 -v update db cfg for DB_NAMEusing MINCOMMIT a_numberdb2 -v terminate
編入組的提交數(shù)目(MINCOMMIT)
MINCOMMIT 的缺省值為1。
如果多個讀/寫應(yīng)用程序通常請求并發(fā)數(shù)據(jù)庫提交,則從缺省值開始
遞增該參數(shù)值,這將產(chǎn)生更有效率的日志文件I/O,因為使用日志文件
I/O 的次數(shù)比較少,而每次使用日志文件I/O 時所寫的日志記錄比較
多。
如果您認(rèn)為缺省值不夠大,可以從3 開始進(jìn)行調(diào)整,在3 的附近嘗試
以查看性能對工作負(fù)載的影響。
可以對每秒鐘的事務(wù)量進(jìn)行采樣,并調(diào)整該參數(shù)以適應(yīng)每秒鐘的峰值
事務(wù)量(或者采用它的某個較大的百分比)。適應(yīng)峰值活動使得在重
負(fù)載期間寫日志記錄的開銷減到了最低。
如果增大MINCOMMIT,可能還需要增大LOGBUFSZ 參數(shù)以避免在
這些重負(fù)載期間強制將已滿的日志緩沖區(qū)寫入磁盤。在這種情況下,
LOGBUFSZ 應(yīng)該等于:
MINCOMMIT * (每個交易平均日志空間的使用量)
編入組的提交數(shù)目(MINCOMMIT)
計算每秒鐘的峰值事務(wù)數(shù):
通過采用典型一天中的監(jiān)視器樣本,可以確定重負(fù)載時期。
1. 在測量開始時,發(fā)出下面這個命令:
–db2 -v reset monitor for database db_name(這不會使高水位的計數(shù)器復(fù)位。)
2. 在測量完畢后,發(fā)出下面這個命令:
–db2 -v get snapshot for database on db_name
3. 使用以下輸出來計算事務(wù)的峰值:
Last reset timestamp = 06-12-2001 14:51:43.786876
Snapshot timestamp = 06-12-2001 14:56:27.787088
Commit statements attempted = 1011
Rolback statements attempted = 10
Log space used by the database (Bytes) = 3990
4. 讓totalTransactions等于“commit statements attempted”和“rollback statements
attempted”的總和。
5. 讓totalElapsedTime(單位為秒)等于“Last reset timestamp”和“Snapshot
timestamp”的差。
6. 如下計算每秒事務(wù)數(shù):
–NumOfTransPerSecond= totalTransactions/ totalElapsedTime
編入組的提交數(shù)目(MINCOMMIT)
計算每個事務(wù)所使用的日志空間:
通過在一段時間內(nèi)對一些事務(wù)使用抽樣技術(shù),可以通過下面這個監(jiān)視器元
素:log_space_used(所使用的工作日志空間單元)計算出使用的日志
空間的平均值。
1. 在測量開始時使用下面這個命令將感興趣的數(shù)據(jù)庫的監(jiān)視器復(fù)位:
db2 -v reset monitor for database db_name.
2. 在測量完畢后使用下面這個命令獲取快照:
db2 -v get snapshot for database on db2_name.
3. 使用下面這個公式計算出每個事務(wù)所使用的日志空間:
LogSpaceUsedPerTrans= log_space_used/ totalTransactions