DB2 V9.5工作負載管理(七)

rheet1978發表於2008-12-15
工作類(WORK CLASS)和工作操作(WORK ACTION)

除了使用工作所在的資料庫連線屬性標識資料庫活動以外,你還可以通過建立可選的工作類,通過基於工作的型別來標識資料庫活動。這些型別屬性可以是READ , WRITE , DML , DDL , LOAD , CALL ,ALL。工作型別屬性具體的介紹如下:

Ø         READ

此屬性對應的活動包括以下語句:

1.        所有的SELECT或者SELECT INTO語句,並且語句中不包含DELETE , INSERT , MERGE , UPDATE語句;

2.        所有的VALUES INTO語句;

3.        所有的XQuery語句。

Ø         WRITE

此屬性對應的活動包括以下語句:

1.        所有的UPDATE語句;

2.        所有的DELETE語句;

3.        所有的INSERT語句;

4.        所有的MERGE語句;

5.        所有的包含DELETE, INSERT, UPDATE 的SELECT語句;

6.        所有的XQuery語句。

Ø         CALL

此屬性對應的活動包括所有的 CALL 語句。如果想讓工作類包含一個CALL語句 ,其工作型別可以是CALL或者ALL。

Ø         DML

所有在READ和WRITE中出現的語句都是DML語句。

Ø         DDL

此屬性對應的活動包括以下語句:

1.        所有的ALTER語句;

2.        所有的CREATE語句;

3.        所有的COMMENT語句;

4.        所有的DECLARE GLOBAL TEMPORARY TABLE語句;

5.        所有的DROP語句;

6.        所有的FLUSH PACKAGE CACHE語句;

7.        所有的GRANT語句;

8.        所有的REFRESH TABLE語句;

9.        所有的RENAME語句;

10.    所有的REVOKE語句;

11.    所有的SET INTEGRITY語句;

Ø         LOAD

此屬性對應的活動包括所有的LOAD操作。

Ø         ALL

此屬性對應的活動可以是以上屬性中出現任意一個活動。

 

工作操作(WORK ACTION)是一個用來控制某一種型別工作所對應資料庫活動的方法。簡單的說就是,當資料庫活動滿足已經定義好的工作類(WORK CLASS)所涉及的範圍時,就會觸發相應的工作操作(WORK ACTION)。

下面我們在視窗1中,發出CREATE WORK CLASS SET命令,建立工作類集myquery,其下包含三個工作類,分別是針對小型查詢的smallquery,針對中型查詢的mediumquery以及針對大型查詢的largequery,工作型別都是DML,具體如清單27所示:

 

- - 清單27 . 在視窗1中建立工作類集

 

C:\> db2 connect to db2test1 user administrator using passw0rd

 

   資料庫連線資訊

 

 資料庫伺服器         = DB2 / NT 9.5.0

 SQL 授權標識         = ADMINIST . . .

 本地資料庫別名       = DB2TEST1

 

 

C:\> db2 - tvf crtWorkClassSet.sql

drop work class set myquery

DB21034E  該命令被當作 SQL 語句來處理,因為它是無效的“命令列處理器”命令。在

SQL 處理期間,它返回:

SQL0204N  " MYQUERY " 是一個未定義的名稱。  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命令成功完成。

 

 

    命令成功完成,這樣我們就建立了一個工作類集和三個工作類。工作類smallQuery包含的範圍是:當一個特定的DML活動,其估計成本大於1 timeron 且小於等於1000 timerons。需要注意的是,成本是由 CPU 成本(以指令數計)和 I/O(以尋道數和頁的轉換數計)的組合得出的。成本的單位是 timeron。timeron 不直接等於任何實際的所用時間,只是給出粗略估計的資源(成本)。工作類mediumQuery包含的範圍是:當一個特定的DML活動,其估計成本大於1000 timeron 且小於等於100000 timerons。工作類largeQuery包含的範圍是:當一個特定的DML活動,其估計成本大於100000 timeron ,沒有上限。

下面我們繼續在視窗1中建立相應的工作動作集以及工作動作。發出CREATE WORK ACTION SET命令,建立工作動作集MYWORKACTION,並建立面向工作類smallQuery的工作動作smallQueryAction,面向工作類mediumQuery的工作動作mediumQueryAction,面向工作類largeQuery的工作動作largeQueryAction,具體如清單28所示:

 

- - 清單28 . 在視窗1中建立工作動作集

 

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命令成功完成。

 

命令成功完成。這樣我們就建立了1個工作動作集和3個工作動作。

工作動作集MYWORKACTION對應的工作類集MYQUERY。工作動作smallQueryAction對應的工作類是smallQuery,且指定了count activity選項,含義是指定工作類smallQuery所對應的資料庫活動,只要其任何一個在執行,則這個工作類的計數器就會累積增長。

工作動作mediumQueryAction對應的工作類是mediumQuery,且指定了collect activity data with details and values選項,collect activity data的含義是當工作類mediumQuery相關的每一個活動完成後,都將其資料傳送給相關合適的事件監控器;with details的含義是當相關的活動完成後,還要把相關的語句和編譯環境傳送給相關的時間監控器;and values的含義是那些活動相關的輸入資料值也傳送給相關的事件監控器。

工作動作largeQueryAction對應的工作類是largeQuery,且指定了when concurrentdbcoordactivities > 1 and queuedactivities > 1 stop execution選項,含義是當併發的資料庫協調器活動(database coordinator activities)大於1時,資料庫管理器將對活動進行排隊,對後來的資料庫協調器活動(比如一個查詢)放入排隊佇列。並且當排隊的活動也大於1時,資料庫活動將不允許執行。

下面我們繼續在視窗2中用RHETTE使用者連線示例資料庫DB2TEST1,並執行兩個查詢,在視窗3中用RHETTE使用者連線示例資料庫DB2TEST1,也執行兩個相同的查詢,然後在視窗2中通過呼叫表函式WLM_GET_WORK_ACTION_SET_STATS,檢視工作動作集的狀態,具體如清單29所示:

 

- - 清單29_1 . 在視窗2中執行兩個查詢

 

C:\> db2 connect to db2test1 user rhette using passw0rd

 

   資料庫連線資訊

 

 資料庫伺服器         = DB2 / NT 9.5.0

 SQL 授權標識         = RHETTE

 本地資料庫別名       = 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 條記錄已選擇。

 

- - 清單29_2 . 在視窗3中執行兩個查詢

 

C:\> db2 connect to db2test1 user rhette using passw0rd

 

   資料庫連線資訊

 

 資料庫伺服器         = DB2 / NT 9.5.0

 SQL 授權標識         = RHETTE

 本地資料庫別名       = 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 條記錄已選擇。

 

- - 清單29_3 . 在視窗2中檢視工作動作集的狀態

 

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 條記錄已選擇。

 

命令成功完成。

 

接下來我們看一下如果同時在三個視窗執行同樣的大型SQL,會出現什麼樣的狀況。首先在視窗1中執行一個大型查詢SQL,同時在視窗2、3也同時執行同樣的大型sql,在視窗3會報“SQL4712N  已超過閾值 =‘SQL080103142608430’。原因碼 = ‘6’。  SQLSTATE = 5U026”錯誤。視窗1和視窗2最終將查詢出結果集來。具體如清單30所示:

 

 - - 清單30_1 . 在視窗1中執行大型查詢

 

C:\> db2 connect to db2test1 user rhette using passw0rd

 

   資料庫連線資訊

 

 資料庫伺服器         = DB2 / NT 9.5.0

 SQL 授權標識         = RHETTE

 本地資料庫別名       = DB2TEST1

 

C:\> db2 select count ( * ) from project , project , project , project , project , project

 

1

- - - - - - - - - - - - - - - - - - - - - -

   64000000

 

1 條記錄已選擇。

 

- - 清單30_2 . 在視窗2中執行大型查詢

 

C:\> db2 select count ( * ) from project , project , project , project , project , project

 

1

- - - - - - - - - - - - - - - - - - - - - -

   64000000

 

1 條記錄已選擇。

 

- - 清單30_3 . 在視窗3中執行大型查詢

C:\> db2 select count ( * ) from project , project , project , project , project , project

SQL4712N  已超過閾值 " SQL080103142608430 "。原因碼 = " 6 "。  SQLSTATE = 5U026

 

 

 

總結工作負載管理(WLM)        通過上面的講述和具體的例子,我們可以發現使用DB2 V9.5工作負載管理(WLM)可以更好地控制系統資源,增加了可預測性和穩定性。我們可以定義一個混合的工作負載來滿足複雜的場景需求。針對越來越複雜的資料庫活動,我們可以預定義一組工作負載,並使用相應的服務類、閾值、工作類和工作動作來標識資料庫活動並將它們隔離在自己的執行環境中,並給其分配達到我們設定目標所需要的適當資源。在環境或服務類中,您可以顯式管理系統資源,以便較重要的資源可供較高優先順序的工作使用,並可以控制或消除與較低優先順序工作的爭用情況。

       當我們的生產系統在高峰期時,增加的資料庫活動會影響資料庫的效能,通過使用工作負載管理(WLM),我們可以預先確定適當的資源分配、活動的優先順序劃分和排隊選項來高效地處理工作,從而可以平滑高峰工作負載。在您定義這些指示後,資料伺服器使用它們來分配資源和劃分工作的優先順序。例如,您可以使工作遠離流氓查詢的影響,這些查詢使用過量的資料庫資源,因此會對系統上執行的其他查詢帶來負面影響並可能會影響整個資料庫。通過使用閾值,您可以使用許多不同特徵(如執行時間或系統臨時表空間使用量)來定義系統內可接受的查詢行為,並定義對不按要求執行的任何查詢要執行哪些操作。這些操作包括收集關於查詢的詳細資訊的功能以及自動取消查詢的功能。

       另外,通過使用DB2 V9.5新增的許多表函式,我們可以動態的監視資料庫活動,可以讓我們清楚哪個工作當前正在系統上執行、它在分割槽上的分佈情況以及是否有特定的活動可能導致資料伺服器上發生資源爭用情況。

參考資料

學習


獲得產品和技術


討論

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9524210/viewspace-511960/,如需轉載,請註明出處,否則將追究法律責任。

相關文章