按照事務類型分析 DB2 事物的性能
概述:事務是數(shù)據(jù)庫系統(tǒng)中的核心概念之一。作為數(shù)據(jù)庫系統(tǒng)的邏輯工作單元(Unit of Work),事務必須具有四個屬性,即原子性、一致性、隔離性和持久性(ACID)。數(shù)據(jù)庫系統(tǒng)往往通過鎖機制保證事務的隔離性,通過日志機制保證事務的持久性。應用程序可以通過啟動、提交、回滾等操作來控制一個事務的執(zhí)行與停止。從應用的角度來看,一個事務往往對應一系列緊密關(guān)聯(lián)的用戶操作,例如銀行系統(tǒng)中的存款、轉(zhuǎn)賬等。對于用戶而言,提交一個事務相當于完成某種交易行為,因此執(zhí)行一個事務前后跨越的時間是影響用戶體驗的因素之一。
數(shù)據(jù)庫系統(tǒng)的性能是評判數(shù)據(jù)庫系統(tǒng)的重要因素之一,DB2 作為一款成功的數(shù)據(jù)庫產(chǎn)品提供了很多性能調(diào)優(yōu)的特征與功能。一方面 DB2 在數(shù)據(jù)庫管理器層和數(shù)據(jù)庫層提供了大量的可配置參數(shù),通過 db2 get/update dbm cfg和db2 get/update db cfg 可以查看和修改這些參數(shù),并且可以通過控制中心(Control Center, db2cc)中的 Configuration Advisor 來獲得優(yōu)化的配置參數(shù)值。另一方面DB2提供了針對查詢的優(yōu)化功能,例如 SQL Explain Facility 可以分析一個 SQL 語句優(yōu)化后的訪問計劃(Access Plan),命令行編輯器(Command Editor)中也提供了訪問計劃的圖形化視圖。但是如果想監(jiān)測和分析一個事務的性能,例如事務的執(zhí)行時間,事務中每一個 SQL 語句的執(zhí)行時間,事務中的空閑時間等,則無法簡單的通過現(xiàn)有工具來實現(xiàn)。本文將介紹一種分析 DB2 的事務性能的方法,從而幫助數(shù)據(jù)庫設(shè)計者和管理員調(diào)優(yōu)數(shù)據(jù)庫性能。
事務的邏輯組成
一個事務在邏輯上可以由一組 SQL 語句和一個提交/回滾操作組成。在 DB2 中,事務由第一個向數(shù)據(jù)庫發(fā)出的 SQL 語句隱式啟動,而不需要發(fā)出啟動事務的命令。所有后續(xù)的來自同一個應用程序的數(shù)據(jù)庫讀寫操作都被歸入用一個事務,直到該應用程序發(fā)出 COMMIT(提交)或者 ROLLBACK(回滾)語句。ROLLBACK 語句會把這個事務造成的對數(shù)據(jù)庫的所有修改都取消掉。如果應用程序沒有發(fā)出 COMMIT 或 ROLLBACK 就正常退出了,這個事務將自動提交。如果在事物的執(zhí)行途中應用程序不正常退出,則將自動回滾。一旦發(fā)出了 COMMIT/ROLLBACK 命令,這個命令就無法停止了。由于事務只是由一串 SQL 語句組成的,所以不存在事務的物理表示。
在執(zhí)行一個事務的過程中,數(shù)據(jù)庫和應用程序可能處于不同的狀態(tài)。例如在圖 1所示的事務中,應用程序順序執(zhí)行了 3 個 SQL 語句并執(zhí)行了 COMMIT 語句。在 t0 到 t1 時間內(nèi)應用程序處于 UOW Executing 狀態(tài)或者 Lock wait,其中 UOW Executing 狀態(tài)是指應用程序在執(zhí)行數(shù)據(jù)庫操作, Lock wait 狀態(tài)是指應用程序在等待對數(shù)據(jù)庫對象的鎖;在 t1 到 t2 時間內(nèi)處于 UOW Waiting, UOW Waiting 是指應用程序當前沒有進行數(shù)據(jù)庫操作。一個事務的執(zhí)行過程消耗的時間可能用于執(zhí)行 SQL 語句、執(zhí)行應用程序代碼或等待鎖,如果某一類事務的性能比較差,需要分辨是在哪一個方面消耗的時間,從而做出調(diào)整。
圖 1. 事務的邏輯組成
分析事務的性能
由于事務在數(shù)據(jù)庫中沒有一個物理的表示,因此無法直接獲得一個事務的監(jiān)控信息。本文將介紹一種方法通過 DB2 的事件監(jiān)控器捕獲的事件和快照得到的信息來綜合分析事務的性能。圖 2為這種方法的流程。
圖 2. 分析事物性能的方法流程圖
下面將按照流程圖中的步驟通過一個實驗詳細介紹分析事物性能的方法。實驗環(huán)境為 DB2 V9.1,操作系統(tǒng)為 Windows XP。實驗中通過壓力測試工具訪問一個部署在 WebSphere Application Server 上的 J2EE 應用 Trade6 [4] 來執(zhí)行一系列的數(shù)據(jù)庫操作,同時捕獲數(shù)據(jù)庫的性能數(shù)據(jù),隨后分析得出數(shù)據(jù)庫系統(tǒng)的事務性能。
圖 3. 實驗環(huán)境
#p#
用 DB2 事件監(jiān)測器(Event Monitor)來捕獲數(shù)據(jù)庫語句事件
首先需要打開 DB2 的事件監(jiān)控器來捕獲數(shù)據(jù)庫中執(zhí)行的 SQL 語句和事務語句。在 DB2 V8 中,提供了兩種監(jiān)測器來讓用戶得到系統(tǒng)監(jiān)測信息,即事件監(jiān)測器(Event Monitor)和快照監(jiān)測器(Snapshot Monitor)[1]。這兩種監(jiān)測器在 DB2 V9 中得到了保留 [2]。這兩種監(jiān)測器可以用來捕獲不同類型的數(shù)據(jù)庫系統(tǒng)信息,在本方法中將利用它們來獲得 SQL 語句、事務語句的執(zhí)行信息和應用程序的狀態(tài)信息。由于這些監(jiān)測器本身會帶來一些系統(tǒng)開銷,例如在進入和完成 SQL 語句的時候需要加入系統(tǒng)調(diào)用,并且需要分配更多的內(nèi)存來保存監(jiān)測數(shù)據(jù),因此一般情況下這些監(jiān)測器是禁用的。在啟動應用程序之前,需要運行如下命令創(chuàng)建并打開針對 SQL 語句和事務語句的事件監(jiān)測器:
mkdir C:\db2\eventmon
db2 "create event monitor SMEVM for statements write to file ' C:\db2\eventmon '"
db2 "set event monitor SMEVM state=1"
其中第一步需要新建一個目錄,本例中給出在 Windows 系統(tǒng)下的命令,生成的目錄需要給數(shù)據(jù)庫管理員賬號讀寫權(quán)限。第二步用 db2 命令行工具[3]創(chuàng)建一個事件監(jiān)控器,監(jiān)控語句事件。在 DB2 中有很多種事件可以被監(jiān)控,應根據(jù)需要選擇被監(jiān)控的事件類型,由于監(jiān)控本身有比較大的性能開銷,盡量不要選擇無關(guān)事件。在這一步中 write to file 子句后面的參數(shù)必須是一個存在的并且可寫的目錄,否則在第三步打開監(jiān)測器的時候會出現(xiàn)錯誤。第三步即通過 db2 命令行工具打開事件監(jiān)測器。在實驗結(jié)束后需要將事件導出成文本形式,以供后面繼續(xù)分析:
db2evmon -db tradedb -evm SMEVM > C:\db2\eventmon.txt
db2 "set event monitor SMEVM state=0"
最后一步用于關(guān)閉事件監(jiān)測器。下面是一個導出的文本文件的例子,部分無關(guān)信息被省略。
清單 1. 語句事件文件
--------------------------------------------------------------------------
EVENT LOG HEADER
Event Monitor name: SMEVM
…
Server instance name: db2inst1
--------------------------------------------------------------------------
--------------------------------------------------------------------------
Database Name: TRADEDB
…
--------------------------------------------------------------------------
4) Statement Event ...
Appl Handle: 7
Appl Id: *LOCAL.db2inst1.070109081142
Appl Seq number: 00078
Record is the result of a flush: FALSE
-------------------------------------------
Operation: Static Commit
Package :
Consistency Token :
Package Version ID :
Cursor :
Cursor was blocking: FALSE
-------------------------------------------
Start Time: 01/09/2007 01:19:48.601550
Stop Time: 01/09/2007 01:19:48.601574
Exec Time: 0.000024 seconds
Number of Agents created: 1
User CPU: 0.000000 seconds
System CPU: 0.000000 seconds
Fetch Count: 0
Sorts: 0
Total sort time: 0
Sort overflows: 0
Rows read: 0
Rows written: 0
Internal rows deleted: 0
Internal rows updated: 0
Internal rows inserted: 0
Bufferpool data logical reads: 0
Bufferpool data physical reads: 0
Bufferpool temporary data logical reads: 0
Bufferpool temporary data physical reads: 0
Bufferpool index logical reads: 0
Bufferpool index physical reads: 0
Bufferpool temporary index logical reads: 0
Bufferpool temporary index physical reads: 0
Bufferpool xda logical page reads: 0
Bufferpool xda physical page reads: 0
Bufferpool temporary xda logical page reads: 0
Bufferpool temporary xda physical page reads: 0
SQLCA:
sqlcode: 0
sqlstate: 00000
…
48) Statement Event ...
Appl Handle: 138
Appl Id: 127.0.0.1.8096.070109091708
Appl Seq number: 00024
Record is the result of a flush: FALSE
-------------------------------------------
Type : Dynamic
Operation: Open
Section : 16
Creator : NULLID
Package : SYSSN200
Consistency Token : SYSLVL01
Package Version ID :
Cursor : SQL_CURSN200C16
Cursor was blocking: FALSE
Text : select * from quoteejb q where q.symbol=? For Update
-------------------------------------------
Start Time: 01/09/2007 01:23:05.894949
Stop Time: 01/09/2007 01:23:05.894970
…
SQLCA:
sqlcode: 0
sqlstate: 00000
可以看出,該文件由一組事件記錄組成,每一條記錄有一個唯一的編號和一組屬性,如應用程序句柄,操作類型,開始時間,結(jié)束時間等。主要內(nèi)容如表 1所示。
表 1. 事件記錄屬性列表
屬性名稱 意義 值/范圍 備注
Appl Handle 應用程序句柄 整形
Appl Id 應用程序ID 字符串
Appl Seq number 應用程序序號 整形 每當工作單元結(jié)束(即 COMMIT 或 ROLLBACK 終止工作單元)時,此標識就會遞增。appl_id 與 sequence_no 一起唯一地標識一個事務。
Operation 操作類型 Static Commit Rollback Open Close Prepare Describe Execute Static Commit 和 Rollback 是事務語句的事件。一個 Select 語句一般會對應 Prepare, Describe, Open, Close 四個事件。如果是已經(jīng)執(zhí)行過的Select語句,可能只有Open和Close事件。一個 Update/Delete/Insert 語句一般對應 Prepare, Describe, Execute 三個事件。
Start Time 操作開始時間 時間戳
Stop Time 操作結(jié)束時間 時間戳
Text SQL語句內(nèi)容 字符串 動態(tài)SQL語句的參數(shù)會被?代替
#p#
用 DB2 快照(Snapshot)獲得應用程序的狀態(tài)
如前所述,在應用程序執(zhí)行的過程中可能處于不同的狀態(tài),因此需要同時打開DB2快照監(jiān)測器捕獲應用程序狀態(tài)信息。打開DB2快照的命令如下:
db2 update dbm cfg using DFT_MON_SORT ON
db2 update dbm cfg using DFT_MON_LOCK ON
db2 update dbm cfg using DFT_MON_TABLE ON
db2 update dbm cfg using DFT_MON_STMT ON
db2 update dbm cfg using DFT_MON_UOW ON
db2 update dbm cfg using DFT_MON_TIMESTAMP ON
這些快照監(jiān)測器默認設(shè)置是關(guān)閉的,可以通過如下命令查看其狀態(tài):db2 get dbm cfg。在實驗結(jié)束后,如需要關(guān)閉快照監(jiān)測器,可使用 db2 update 命令關(guān)閉,將打開命令中的 ON 改為 OFF 即可。
與事件監(jiān)測器不同,快照監(jiān)測器不是自動捕獲信息的,而是需要通過用戶發(fā)出快照命令才執(zhí)行。因此在實驗過程中,需要不斷的發(fā)出針對應用程序的快照命令,并將結(jié)果保存到文件中。執(zhí)行快照的命令如下:
db2 get snapshot for applications on TRADEDB >> application.snapshot.txt
其中TRADEDB為數(shù)據(jù)庫名稱。下面是一個應用程序的快照結(jié)果,部分無關(guān)信息被省略。
清單 2. 快照監(jiān)測器輸出結(jié)果
Application Snapshot
Application handle = 26
Application status = UOW Waiting
Status change time = 01/09/2007 00:28:08.472486
Application code page = 1208
Application country/region code = 0
DUOW correlation token = N00A1405.O0B0.070412045634
Application name = db2jcc_application
Application ID = N00A1405.O0B0.070412045634
…
Connection request start timestamp = 01/08/2007 23:56:31.937719
Connect request completion timestamp = 01/08/2007 23:56:31.938028
Application idle time = 10 minutes 9 seconds
CONNECT Authorization ID = DB2INST1
…
Last reset timestamp =
Snapshot timestamp = 01/09/2007 00:38:17.953083
按照事務類型分析 DB2 事物的性能,從上文可以看出是個比較復雜的過程,大家在分析時一定要注意一些小細節(jié),個個環(huán)節(jié)都要考慮周全,只有這樣才能做到萬無一失,完善了工作。
【編輯推薦】