DB2 V9.5工作負(fù)載管理之工作類和工作操作
取消一個(gè)數(shù)據(jù)庫(kù)活動(dòng)
在我們生產(chǎn)系統(tǒng)中,可能存在一些正在運(yùn)行的大 SQL,這些活動(dòng)消耗了太多的資源。如果我們想停止這些正在執(zhí)行的活動(dòng),可以調(diào)用 WLM_CANCEL_ACTIVITY() 存儲(chǔ)過程,如果想捕獲一個(gè)活動(dòng)的詳細(xì)信息可以調(diào)用 WLM_CAPTURE_ACTIVITY_IN_PROGRESS() 存儲(chǔ)過程,如果想收集和重置一個(gè)工作負(fù)載對(duì)象的統(tǒng)計(jì)信息可以調(diào)用 WLM_COLLECT_STATS()。這些存儲(chǔ)過程的具體信息如下:
WLM_CANCEL_ACTIVITY ( application_handle , uow_id , activity_id ) .
可以使用這個(gè)存儲(chǔ)過程來取消一個(gè)正在運(yùn)行或者正在排隊(duì)的活動(dòng)。對(duì)某個(gè)特定的活動(dòng)來說,我們可以使用應(yīng)用程序句柄、工作單元標(biāo)識(shí)和活動(dòng)標(biāo)識(shí)來唯一標(biāo)識(shí)。使用這個(gè)存儲(chǔ)過程,我們可以取消任何類型的活動(dòng)。當(dāng)這個(gè)存儲(chǔ)過程執(zhí)行后,被取消的特定活動(dòng)將收到 SQL4725N 的錯(cuò)誤信息。
WLM_CAPTURE_ACTIVITY_IN_PROGRESS ( application_handle , uow_id , activity_id ) .
我們可以使用這個(gè)存儲(chǔ)過程捕獲特定活動(dòng)的詳細(xì)信息,并發(fā)送給活動(dòng)事件監(jiān)控器。這個(gè)存儲(chǔ)過程會(huì)立即發(fā)送信息,而不是等待該活動(dòng)完成再發(fā)送。
WLM_COLLECT_STATS ( ) .
使用這個(gè)存儲(chǔ)過程可以用來收集和重置工作負(fù)載對(duì)象統(tǒng)計(jì)信息。所有跟蹤收集的服務(wù)類、工作負(fù)載、閾值隊(duì)列和工作動(dòng)作集統(tǒng)計(jì)信息,都會(huì)發(fā)送給活動(dòng)統(tǒng)計(jì)信息事件監(jiān)控器(如果存在)并重置。如果沒有活動(dòng)統(tǒng)計(jì)信息事件監(jiān)控器,那么統(tǒng)計(jì)信息將只重置,而不收集。
以上存儲(chǔ)過程調(diào)用中需要的應(yīng)用程序句柄( application_handle )、工作單元標(biāo)識(shí)( uow_id )、活動(dòng)標(biāo)識(shí)( activity_id ),可以通過調(diào)用表函數(shù) WLM_GET_WORKLOAD_OCCURRENCE_ACTIVITIES 來獲得。
我們繼續(xù)在窗口 1 用 ADMINISTRATOR 用戶連接示例數(shù)據(jù)庫(kù) DB2TEST1,在窗口 2 用 RHETTE 用戶連接示例數(shù)據(jù)庫(kù) DB2TEST1,并在窗口 2 中執(zhí)行一個(gè)大的查詢,具體如清單 23 所示:
清單23 . 在窗口 2 中執(zhí)行一個(gè)大的查詢
C:> db2 connect to db2test1 user rhette using passw0rd
數(shù)據(jù)庫(kù)連接信息
數(shù)據(jù)庫(kù)服務(wù)器 = DB2 / NT 9.5.0
SQL 授權(quán)標(biāo)識(shí) = DB2ADMIN
本地?cái)?shù)據(jù)庫(kù)別名 = DB2TEST1
C:> db2 select count ( * ) from rhette.project , rhette.project , rhette.projec
t , rhette.project , rhette.project , rhette.project
在窗口 2 中的大型查詢完成之前,在窗口 1 中調(diào)用表函數(shù) WLM_GET_WORKLOAD_OCCURRENCE_ACTIVITIES,來獲得窗口 2 中正在進(jìn)行的大型查詢的應(yīng)用程序句柄( application_handle )、工作單元標(biāo)識(shí)( uow_id )、活動(dòng)標(biāo)識(shí)( activity_id )信息,在獲得這些信息后,如果還想查看更詳細(xì)的信息,可以根據(jù)應(yīng)用程序句柄通過 LIST APPLICATIONS SHOW DETAIL 來查看。具體如清單 24 所示:
清單 24 . 在窗口 1 中調(diào)用表函數(shù) WLM_GET_WORKLOAD_OCCURRENCE_ACTIVITIES
C:> db2 - tvf get_wkld_activities.txt
SELECT T.APPLICATION_HANDLE , T.UOW_ID , T.ACTIVITY_ID , T.ACTIVITY_TYPE ,
T.ACTIVITY_TYPE , T.ACTIVITY_STATE , T.LOCAL_START_TIME FROM
TABLE( WLM_GET_WORKLOAD_OCCURRENCE_ACTIVITIES ( CAST ( NULL AS BIGINT ) , -2 ) ) T
ORDER BY T.LOCAL_START_TIME
APPLICATION
_HANDLE UOW_ID ACTIVITY_ID ACTIVITY_TYPE ACTIVITY_STATE
LOCAL_START_TIME
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
80 7 1 READ_DML EXECUTING
2008-01-02-17.01.25.306889
81 10 1 READ_DML EXECUTING
2008-01-02-17.01.32.253342
2 條記錄已選擇。
接下來我們來看一下如何取消窗口 2 中正在進(jìn)行的大型查詢,在窗口 1 中調(diào)用 WLM_CANCEL_ACTIVITY 存儲(chǔ)過程,輸入?yún)?shù)使用在清單 24 中獲得的應(yīng)用程序句柄( application_handle )、工作單元標(biāo)識(shí)( uow_id )、活動(dòng)標(biāo)識(shí)( activity_id ),具體如清單 25 所示:
清單25 . 在窗口 1 中調(diào)用 WLM_CANCEL_ACTIVITY 存儲(chǔ)過程取消特定活動(dòng)
C:> db2 call WLM_CANCEL_ACTIVITY( 80 , 7 , 1 )
返回狀態(tài) = 0
此時(shí)窗口 2 中正在執(zhí)行的大型查詢會(huì)收到“ SQL4725N 已取消該活動(dòng)。 SQLSTATE = 57014 ”的相關(guān)信息,具體如清單 26 所示:
清單 26 . 在窗口 2 中獲得特定活動(dòng)取消的相關(guān)信息
C:> db2 select count ( * ) from rhette.project , rhette.project , rhette.projec
t , rhette.project , rhette.project , rhette.project
1
- - - - - - - - - - - - - - - - -
SQL4725N 已取消該活動(dòng)。 SQLSTATE = 57014
工作類( WORK CLASS )和工作操作( WORK ACTION )
除了使用工作所在的數(shù)據(jù)庫(kù)連接屬性標(biāo)識(shí)數(shù)據(jù)庫(kù)活動(dòng)以外,你還可以通過創(chuàng)建可選的工作類,通過基于工作的類型來標(biāo)識(shí)數(shù)據(jù)庫(kù)活動(dòng)。這些類型屬性可以是 READ , WRITE , DML , DDL , LOAD , CALL ,ALL。工作類型屬性具體的介紹如下:
READ
此屬性對(duì)應(yīng)的活動(dòng)包括以下語(yǔ)句:
所有的 SELECT 或者 SELECT INTO 語(yǔ)句,并且語(yǔ)句中不包含 DELETE , INSERT , MERGE , UPDATE 語(yǔ)句;
所有的 VALUES INTO 語(yǔ)句;
所有的 XQuery 語(yǔ)句。
WRITE
此屬性對(duì)應(yīng)的活動(dòng)包括以下語(yǔ)句:
所有的 UPDATE 語(yǔ)句;
所有的 DELETE 語(yǔ)句;
所有的 INSERT 語(yǔ)句;
所有的 MERGE 語(yǔ)句;
所有的包含 DELETE, INSERT, UPDATE 的SELECT 語(yǔ)句;
所有的 XQuery 語(yǔ)句。
CALL
此屬性對(duì)應(yīng)的活動(dòng)包括所有的 CALL 語(yǔ)句。如果想讓工作類包含一個(gè) CALL 語(yǔ)句 ,其工作類型可以是 CALL 或者 ALL。
DML
所有在 READ 和 WRITE 中出現(xiàn)的語(yǔ)句都是 DML 語(yǔ)句。
DDL
此屬性對(duì)應(yīng)的活動(dòng)包括以下語(yǔ)句:
所有的 ALTER 語(yǔ)句;
所有的 CREATE 語(yǔ)句;
所有的 COMMENT 語(yǔ)句;
所有的 DECLARE GLOBAL TEMPORARY TABLE 語(yǔ)句;
所有的 DROP 語(yǔ)句;
所有的 FLUSH PACKAGE CACHE 語(yǔ)句;
所有的 GRANT 語(yǔ)句;
所有的 REFRESH TABLE 語(yǔ)句;
所有的 RENAME 語(yǔ)句;
所有的 REVOKE 語(yǔ)句;
所有的 SET INTEGRITY 語(yǔ)句;
LOAD
此屬性對(duì)應(yīng)的活動(dòng)包括所有的 LOAD 操作。
ALL
此屬性對(duì)應(yīng)的活動(dòng)可以是以上屬性中出現(xiàn)任意一個(gè)活動(dòng)。
工作操作( WORK ACTION )是一個(gè)用來控制某一種類型工作所對(duì)應(yīng)數(shù)據(jù)庫(kù)活動(dòng)的方法。簡(jiǎn)單的說就是,當(dāng)數(shù)據(jù)庫(kù)活動(dòng)滿足已經(jīng)定義好的工作類( WORK CLASS )所涉及的范圍時(shí),就會(huì)觸發(fā)相應(yīng)的工作操作( WORK ACTION )。
下面我們?cè)诖翱?1 中,發(fā)出 CREATE WORK CLASS SET 命令,創(chuàng)建工作類集 myquery,其下包含三個(gè)工作類,分別是針對(duì)小型查詢的 smallquery,針對(duì)中型查詢的 mediumquery 以及針對(duì)大型查詢的 largequery,工作類型都是 DML,具體如清單 27 所示:
清單 27 . 在窗口 1 中創(chuàng)建工作類集
C:> db2 connect to db2test1 user administrator using passw0rd
數(shù)據(jù)庫(kù)連接信息
數(shù)據(jù)庫(kù)服務(wù)器 = DB2 / NT 9.5.0
SQL 授權(quán)標(biāo)識(shí) = ADMINIST . . .
本地?cái)?shù)據(jù)庫(kù)別名 = DB2TEST1
C:> db2 - tvf crtWorkClassSet.sql
drop work class set myquery
DB21034E 該命令被當(dāng)作 SQL 語(yǔ)句來處理,因?yàn)樗菬o(wú)效的“命令行處理器”命令。在
SQL 處理期間,它返回:
SQL0204N ' MYQUERY ' 是一個(gè)未定義的名稱。 SQLSTATE = 42704
create work class set myquery (
work class smallQuery work type dml
for timeroncost from 1 to 1000 ,
work class mediumQuery work type dml
for timeroncost from 1000 to 100000 ,
work class largeQuery work type dml
for timeroncost from 100000 tounbounded )
DB20000I SQL命令成功完成。
命令成功完成,這樣我們就創(chuàng)建了一個(gè)工作類集和三個(gè)工作類。工作類 smallQuery 包含的范圍是:當(dāng)一個(gè)特定的 DML 活動(dòng),其估計(jì)成本大于 1 timeron 且小于等于 1000 timerons。需要注意的是,成本是由 CPU 成本(以指令數(shù)計(jì))和 I/O(以尋道數(shù)和頁(yè)的轉(zhuǎn)換數(shù)計(jì))的組合得出的。成本的單位是 timeron。timeron 不直接等于任何實(shí)際的所用時(shí)間,只是給出粗略估計(jì)的資源(成本)。工作類 mediumQuery 包含的范圍是:當(dāng)一個(gè)特定的 DML 活動(dòng),其估計(jì)成本大于 1000 timeron 且小于等于 100000 timerons。工作類 largeQuery 包含的范圍是:當(dāng)一個(gè)特定的 DML 活動(dòng),其估計(jì)成本大于 100000 timeron ,沒有上限。
下面我們繼續(xù)在窗口 1 中創(chuàng)建相應(yīng)的工作動(dòng)作集以及工作動(dòng)作。發(fā)出 CREATE WORK ACTION SET 命令,創(chuàng)建工作動(dòng)作集 MYWORKACTION,并創(chuàng)建面向工作類 smallQuery 的工作動(dòng)作 smallQueryAction ,面向工作類 mediumQuery 的工作動(dòng)作 mediumQueryAction,面向工作類 largeQuery 的工作動(dòng)作 largeQueryAction,具體如清單 28 所示:
清單 28 . 在窗口 1 中創(chuàng)建工作動(dòng)作集
C:> db2 - tvf crtWorkActionSet.sql
alter work action set MYWORKACTION
alter smallQueryAction disable
alter mediumQueryAction disable
alter largeQueryAction disable
DB20000I SQL命令成功完成。
drop work action set MYWORKACTION
DB20000I SQL命令成功完成。
create work action set MYWORKACTION for database using work class set MYQUERY
( work action smallQueryAction on work class smallQuery
count activity,
work action mediumQueryAction on work class mediumQuery
collect activity data with details and values ,
work action largeQueryAction on work class largeQuery
when concurrentdbcoordactivities > 1 and queuedactivities > 1 stop execution )
DB20000I SQL命令成功完成。
命令成功完成。這樣我們就創(chuàng)建了 1 個(gè)工作動(dòng)作集和 3 個(gè)工作動(dòng)作。
工作動(dòng)作集 MYWORKACTION 對(duì)應(yīng)的工作類集 MYQUERY。工作動(dòng)作 smallQueryAction 對(duì)應(yīng)的工作類是 smallQuery,且指定了 count activity 選項(xiàng),含義是指定工作類 smallQuery 所對(duì)應(yīng)的數(shù)據(jù)庫(kù)活動(dòng),只要其任何一個(gè)在運(yùn)行,則這個(gè)工作類的計(jì)數(shù)器就會(huì)累積增長(zhǎng)。
工作動(dòng)作 mediumQueryAction 對(duì)應(yīng)的工作類是 mediumQuery,且指定了 collect activity data with details and values 選項(xiàng),collect activity data 的含義是當(dāng)工作類 mediumQuery 相關(guān)的每一個(gè)活動(dòng)完成后,都將其數(shù)據(jù)發(fā)送給相關(guān)合適的事件監(jiān)控器;with details 的含義是當(dāng)相關(guān)的活動(dòng)完成后,還要把相關(guān)的語(yǔ)句和編譯環(huán)境發(fā)送給相關(guān)的時(shí)間監(jiān)控器;and values 的含義是那些活動(dòng)相關(guān)的輸入數(shù)據(jù)值也發(fā)送給相關(guān)的事件監(jiān)控器。
工作動(dòng)作 largeQueryAction 對(duì)應(yīng)的工作類是 largeQuery,且指定了 when concurrentdbcoordactivities > 1 and queuedactivities > 1 stop execution 選項(xiàng),含義是當(dāng)并發(fā)的數(shù)據(jù)庫(kù)協(xié)調(diào)器活動(dòng)( database coordinator activities )大于 1 時(shí),數(shù)據(jù)庫(kù)管理器將對(duì)活動(dòng)進(jìn)行排隊(duì),對(duì)后來的數(shù)據(jù)庫(kù)協(xié)調(diào)器活動(dòng)(比如一個(gè)查詢)放入排隊(duì)隊(duì)列。并且當(dāng)排隊(duì)的活動(dòng)也大于1時(shí),數(shù)據(jù)庫(kù)活動(dòng)將不允許執(zhí)行。
下面我們繼續(xù)在窗口 2 中用 RHETTE 用戶連接示例數(shù)據(jù)庫(kù) DB2TEST1,并執(zhí)行兩個(gè)查詢,在窗口 3 中用 RHETTE 用戶連接示例數(shù)據(jù)庫(kù) DB2TEST1 ,也執(zhí)行兩個(gè)相同的查詢,然后在窗口 2 中通過調(diào)用表函數(shù) WLM_GET_WORK_ACTION_SET_STATS ,查看工作動(dòng)作集的狀態(tài),具體如清單 29 所示:
清單 29. 在窗口 2 中執(zhí)行兩個(gè)查詢
C:> db2 connect to db2test1 user rhette using passw0rd
數(shù)據(jù)庫(kù)連接信息
數(shù)據(jù)庫(kù)服務(wù)器 = DB2 / NT 9.5.0
SQL 授權(quán)標(biāo)識(shí) = RHETTE
本地?cái)?shù)據(jù)庫(kù)別名 = DB2TEST1
C:> db2 select count ( * ) from project , project , project
1
- - - - - - - - - - - - - - - - - - - - - -
8000
1 條記錄已選擇。
C:> db2 select count ( * ) from project , project , project , project , project
1
- - - - - - - - - - - - - - - - - - - - - -
3200000
1 條記錄已選擇。
清單 30. 在窗口 3 中執(zhí)行兩個(gè)查詢
C:> db2 connect to db2test1 user rhette using passw0rd
數(shù)據(jù)庫(kù)連接信息
數(shù)據(jù)庫(kù)服務(wù)器 = DB2 / NT 9.5.0
SQL 授權(quán)標(biāo)識(shí) = RHETTE
本地?cái)?shù)據(jù)庫(kù)別名 = DB2TEST1
C:> db2 select count ( * ) from project , project , project
1
- - - - - - - - - - - - - - - - - - - - - -
8000
1 條記錄已選擇。
C:> db2 select count ( * ) from project , project , project , project , project , project
1
- - - - - - - - - - - - - - - - - - - - - -
64000000
1 條記錄已選擇。
清單 31. 在窗口 2 中查看工作動(dòng)作集的狀態(tài)
C:> db2 select substr( work_action_set_name , 1 , 18 ) as work_action_set_name ,
substr ( char ( dbpartitionnum ) , 1 , 4 ) as part ,
substr ( work_class_name , 1 , 15 ) as work_class_name , last_reset ,
substr ( char ( act_total ) , 1 , 14 ) as total_wlo_acts from
table ( WLM_GET_WORK_ACTION_SET_STATS ( cast ( null as varchar ( 128 ) ) , -2 ) )
as wasstats order by work_action_set_name , work_class_name , part
WORK_ACTION_SET_NAME PART WORK_CLASS_NAME LAST_RESET TOTAL_WLO_ACTS
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MYWORKACTION 0 * 2008-01-03-14.26.15.293798 0
MYWORKACTION 0 LARGEQUERY 2008-01-03-14.26.15.293791 1
MYWORKACTION 0 MEDIUMQUERY 2008-01-03-14.26.15.293754 1
MYWORKACTION 0 SMALLQUERY 2008-01-03-14.26.15.293717 3
4 條記錄已選擇。
命令成功完成。
接下來我們看一下如果同時(shí)在三個(gè)窗口執(zhí)行同樣的大型 SQL,會(huì)出現(xiàn)什么樣的狀況。首先在窗口 1 中執(zhí)行一個(gè)大型查詢 SQL,同時(shí)在窗口 2、3 也同時(shí)執(zhí)行同樣的大型 sql,在窗口 3 會(huì)報(bào)“ SQL4712N 已超過閾值 =‘SQL080103142608430’。原因碼 = ‘6’。 SQLSTATE = 5U026”錯(cuò)誤。窗口 1 和窗口 2 最終將查詢出結(jié)果集來。具體如清單 30 所示:
清單 32. 在窗口 1 中執(zhí)行大型查詢
C:> db2 connect to db2test1 user rhette using passw0rd
數(shù)據(jù)庫(kù)連接信息
數(shù)據(jù)庫(kù)服務(wù)器 = DB2 / NT 9.5.0
SQL 授權(quán)標(biāo)識(shí) = RHETTE
本地?cái)?shù)據(jù)庫(kù)別名 = DB2TEST1
C:> db2 select count ( * ) from project , project , project , project , project , project
1
- - - - - - - - - - - - - - - - - - - - - -
64000000
1 條記錄已選擇。
清單 33. 在窗口 2 中執(zhí)行大型查詢
C:> db2 select count ( * ) from project , project , project , project , project , project
1
- - - - - - - - - - - - - - - - - - - - - -
64000000
1 條記錄已選擇。
清單 34. 在窗口 3 中執(zhí)行大型查詢
C:> db2 select count ( * ) from project , project , project , project , project ,
project
SQL4712N 已超過閾值 ' SQL080103142608430 '。原因碼 = ' 6 '。 SQLSTATE = 5U026
總結(jié)工作負(fù)載管理( WLM )
通過上面的講述和具體的例子,我們可以發(fā)現(xiàn)使用 DB2 V9.5 工作負(fù)載管理( WLM )可以更好地控制系統(tǒng)資源,增加了可預(yù)測(cè)性和穩(wěn)定性。我們可以定義一個(gè)混合的工作負(fù)載來滿足復(fù)雜的場(chǎng)景需求。針對(duì)越來越復(fù)雜的數(shù)據(jù)庫(kù)活動(dòng),我們可以預(yù)定義一組工作負(fù)載,并使用相應(yīng)的服務(wù)類、閾值、工作類和工作動(dòng)作來標(biāo)識(shí)數(shù)據(jù)庫(kù)活動(dòng)并將它們隔離在自己的執(zhí)行環(huán)境中,并給其分配達(dá)到我們?cè)O(shè)定目標(biāo)所需要的適當(dāng)資源。在環(huán)境或服務(wù)類中,您可以顯式管理系統(tǒng)資源,以便較重要的資源可供較高優(yōu)先級(jí)的工作使用,并可以控制或消除與較低優(yōu)先級(jí)工作的爭(zhēng)用情況。
當(dāng)我們的生產(chǎn)系統(tǒng)在高峰期時(shí),增加的數(shù)據(jù)庫(kù)活動(dòng)會(huì)影響數(shù)據(jù)庫(kù)的性能,通過使用工作負(fù)載管理( WLM ),我們可以預(yù)先確定適當(dāng)?shù)馁Y源分配、活動(dòng)的優(yōu)先級(jí)劃分和排隊(duì)選項(xiàng)來高效地處理工作,從而可以平滑高峰工作負(fù)載。在您定義這些指示后,數(shù)據(jù)服務(wù)器使用它們來分配資源和劃分工作的優(yōu)先級(jí)。例如,您可以使工作遠(yuǎn)離流氓查詢的影響,這些查詢使用過量的數(shù)據(jù)庫(kù)資源,因此會(huì)對(duì)系統(tǒng)上運(yùn)行的其他查詢帶來負(fù)面影響并可能會(huì)影響整個(gè)數(shù)據(jù)庫(kù)。通過使用閾值,您可以使用許多不同特征(如執(zhí)行時(shí)間或系統(tǒng)臨時(shí)表空間使用量)來定義系統(tǒng)內(nèi)可接受的查詢行為,并定義對(duì)不按要求執(zhí)行的任何查詢要執(zhí)行哪些操作。這些操作包括收集關(guān)于查詢的詳細(xì)信息的功能以及自動(dòng)取消查詢的功能。
另外,通過使用 DB2 V9.5 新增的許多表函數(shù),我們可以動(dòng)態(tài)的監(jiān)視數(shù)據(jù)庫(kù)活動(dòng),可以讓我們清楚哪個(gè)工作當(dāng)前正在系統(tǒng)上運(yùn)行、它在分區(qū)上的分布情況以及是否有特定的活動(dòng)可能導(dǎo)致數(shù)據(jù)服務(wù)器上發(fā)生資源爭(zhēng)用情況。
