シナリオ: 完了に時間がかかり過ぎているアクティビティーの識別
ワークロード管理表関数を使用すると、データ・サーバー内の特定のアクティビティーを識別したり、必要に応じてアプリケーション全体を終了させることなくそのアクティビティーを取り消したりするタスクを単純化することができます。
完了に時間がかかり過ぎているアクティビティーの識別
以下は、長時間実行照会の識別の例です。 SalesReport アプリケーションを実行中の販売部のユーザーから、アプリケーションの完了に時間がかかり過ぎているとの苦情が報告されたとします。
SELECT SUBSTR(CHAR(COORD_MEMBER),1,5) AS COORD,
SUBSTR(CHAR(MEMBER),1,4) AS MEMB,
SUBSTR(CHAR(UOW_ID),1,5) AS UOWID,
SUBSTR(CHAR(ACTIVITY_ID),1,5) AS ACTID,
SUBSTR(CHAR(PARENT_UOW_ID),1,8) AS PARUOWID,
SUBSTR(CHAR(PARENT_ACTIVITY_ID),1,8) AS PARACTID,
SUBSTR(ACTIVITY_TYPE,1,8) AS ACTTYPE,
SUBSTR(CHAR(NESTING_LEVEL),1,7) AS NESTING
FROM TABLE(WLM_GET_WORKLOAD_OCCURRENCE_ACTIVITIES(1, -2))
AS WLOACTS
ORDER BY MEMB, UOWID, ACTID
COORD MEMB UOWID ACTID PARUOWID PARACTID ACTTYPE NESTING
----- ---- ----- ----- -------- -------- -------- -------
0 0 2 3 - - CALL 0
0 0 2 5 2 3 READ_DML 1
SELECT APPLICATION_HANDLE, UOW_ID, ACTIVITY_ID,
SUBSTR(REQUEST_TYPE,1,8) AS REQUEST_TYPE,
SUBSTR(EVENT_TYPE,1,8) AS EVENT_TYPE,
SUBSTR(EVENT_OBJECT,1,8) AS EVENT_OBJECT
FROM TABLE(WLM_GET_SERVICE_CLASS_AGENTS('', '', CAST(NULL AS BIGINT),-2))
AS AGENTS
WHERE APPLICATION_HANDLE = 1
AND UOW_ID = 2
AND ACTIVITY_ID = 5
APPLICATION_HANDLE UOW_ID ACTIVITY_ID REQUEST_TYPE EVENT_TYPE EVENT_OBJECT
------------------ ------ ----------- ------------ ---------- ------------
1 2 5 OPEN WAIT WLM_QUEUEAPPLICATION_HANDLE UOW_ID ACTIVITY_ID REQUEST_TYPE EVENT_TYPE EVENT_OBJECT
------------------ ------ ----------- ------------ ---------- ------------
1 2 5 OPEN PROCESS REQUESTAPPLICATION_HANDLE UOW_ID ACTIVITY_ID REQUEST_TYPE EVENT_TYPE EVENT_OBJECT
------------------ ------ ----------- ------------ ---------- ------------
1 2 5 OPEN ACQUIRE LOCK- アクティビティーがキューに存在する場合、照会の実行時間が長すぎてもはやユーザーが結果に関心がない、または照会が消費しているリソース量が多すぎると判断するのであれば、その照会を取り消せます。
- 重要なアクティビティーがキューに存在する場合、現在実行中の作業のうちそれほど重要でない他のものを取り消すことを考慮するか (並行性を減らして重要なアクティビティーがキューに入れられたままにする)、また、その作業がハングしているわけではなく、待機しているだけであることが分かるとユーザーは納得する場合もあります。
- アクティビティーがロックを待機している場合、スナップショット・モニターを使用してアプリケーションが待機しているロックについて調査できます。
- アクティビティーが待機しているロックが優先度の低いアクティビティーによって保持されているのであれば、その優先度の低いアクティビティーを取り消すことを考慮してください。
アクティビティー 5 が実行中の DML ステートメントについて把握することが役立つ場合もあります。 アクティブ・アクティビティー・イベント・モニターがあると仮定します。WLM_CAPTURE_ACTIVITY_IN_PROGRESS プロシージャーを実行すると、アクティビティー 5 が実行中の DML ステートメントに関する情報および他の情報をキャプチャーできます。 WLM_CAPTURE_ACTIVITY_IN_PROGRESS プロシージャーを使用すると、ステートメント・イベント・モニターとは異なり、その時点で実行されているすべてのステートメントではなく特定の照会に関する情報をキャプチャーできます。 MON_GET_ACTIVITY_DETAILS を使用してステートメント・テキストを取得することもできます。
CALL WLM_CANCEL_ACTIVITY (1, 2, 5)アクティビティーを発行したアプリケーションは SQL4725N エラーを受け取ります。 負の SQL コードを処理するアプリケーションはこの SQL コードを処理できます。
ロック競合によるアクティビティー・ハングの識別
あるユーザーから時間がかかり過ぎているアプリケーションに関して苦情が報告されたとします。 さらに、その長期実行アプリケーションのアプリケーション名または許可 ID のいずれかが分かっていると想定してください。 この情報を使用すると、 LIST APPLICATIONS コマンドを使用してアプリケーション・ハンドルを取得できます。 LIST APPLICATIONS コマンドによって返されるアプリケーション・ハンドルが 2 であるとすると、WLM_GET_SERVICE_CLASS_AGENTS 表関数を使用して、このアクティビティーを処理しているエージェントを判別できます。 照会は次のようになります。
SELECT SUBSTR(CHAR(APPLICATION_HANDLE),1,7) AS APPHANDLE,
SUBSTR(CHAR(MEMBER),1,4) AS MEMB,
SUBSTR(CHAR(AGENT_TID),1,9) AS AGENT_TID,
SUBSTR(AGENT_TYPE,1,11) AS AGENTTYPE,
SUBSTR(EVENT_OBJECT,1,11) AS EVENTOBJECT,
SUBSTR(REQUEST_TYPE,1,7) AS REQTYPE,
SUBSTR(CHAR(UOW_ID),1,6) AS UOW_ID,
SUBSTR(CHAR(ACTIVITY_ID),1,6) AS ACT_ID
FROM TABLE(WLM_GET_SERVICE_CLASS_AGENTS('', '', 2, -2)) AS SCDETAILS
ORDER BY APPHANDLE, MEMB, AGENT_TID
APPHANDLE MEMB AGENT_TID AGENTTYPE EVENTOBJECT REQTYPE UOW_ID ACT_ID
--------- ---- --------- ----------- ----------- ------- ------ ------
2 0 1 COORDINATOR REQUEST OPEN 2 1
2 1 3 SUBAGENT LOCK - 2 1
エージェント 1 がリモート応答を待機中であることを結果は示しています。 同じアクティビティーを操作しているリモート・メンバー上のエージェントを見ると、そのエージェントがロックを取得するために待機中であることが EVENTOBJECT フィールドから分かります。
SELECT REQ_APPLICATION_HANDLE AS WAITING_FOR_LOCK,
HLD_APPLICATION_HANDLE AS HOLDING_LOCK,
CAST(LOCK_MODE_REQUESTED AS SMALLINT) AS WANTED,
CAST(LOCK_MODE AS SMALLINT) AS HELD
FROM TABLE(MON_GET_APPL_LOCKWAIT (null, -1)) AS SLW
WAITING_FOR_LOCK HOLDING_LOCK WANTED HELD
-------------------- ---------------------- ------ ------
2 7 9 5
db2pd -db database alias -locks
db2pd -db database alias -transactions長期実行アクティビティーを取り消す場合には、WLM_CANCEL_ACTIVITY プロシージャーを使用できます。 長期実行アプリケーションを正常終了させる方がロックを所有しているアプリケーションを正常終了させるよりも重要な場合には、ロックを所有しているアプリケーションを強制終了させます。