DBQLUtilityLogTblを使用して、ユーティリティ パフォーマンスの問題を診断し、容量計画を行なうことができます。以下に、テーブルの使用例をいくつか挙げます。
今日実行したジョブにいつもより時間がかかった理由の調査
このシナリオでは、今日実行したFastLoadジョブに昨日よりかなり時間がかかりました。その根本的な理由を追求します。例はFastLoad固有ですが、この一般的な手法をその他のユーティリティに使用することができます。
- 以下の基準を使用して、DBQLUtilityTblから昨日と今日のジョブの行を取得します。
- このFastLoadジョブを固有に識別するジョブ属性。この基準はこのFastLoadジョブのすべてのインスタンスを返します。可能なジョブ属性は以下のとおりです。
- UtilityName = 'FASTLOAD'
- ユーザー名
- クエリー バンド
- ユーティリティ リクエスト
- ジョブ終了時刻:今日または昨日。
- このFastLoadジョブを固有に識別するジョブ属性。この基準はこのFastLoadジョブのすべてのインスタンスを返します。可能なジョブ属性は以下のとおりです。
- 2つの行のさまざまな列値を比較し、可能な原因を追究します。提案には以下が含まれます。
- RowsInserted値を比較します。今日のジョブで昨日より非常に多くの行をロードした場合、これが原因である可能性があります。そうでない場合、次のステップを続行します。
- DelayTime値を比較します。増加は、今日のジョブが昨日よりTASMによって遅れたことを示します。
- 各フェーズの経過時間(PhasexEndTime - PhasexStartTime)を比較し、経過時間に大きな増加のあるフェーズを特定します。
- 経過時間に大きな増加のあるフェーズが取得フェーズである場合、 MaxDataWaitTimeの増加を確認します。クライアント マシンでのより多くのロード、またはより遅いネットワーク応答時間が原因である場合があります。
- 経過時間に大きな増加のあるフェーズのリソース利用を比較して、追加のヒントを見つけます。例えば、次のようになります。
- PhasexMaxCPUTimeの増加はデータ スキューを示すことがあります。
- Phase1メッセージ(Phase1BlockCount)の増加は、より小さなメッセージ サイズが使用されたことを示すことがあります。
- DBQLogTblの関連する問合せログ データを確認します。必要なデータを選択するには、以下を使用します。
- 特定のジョブのすべての行を選択するLSN。
- 特定のフェーズの行を選択するPhasexStartTimeおよびPhasexEndTime。
性能異常の検出
このシナリオでは、経過時間が同じジョブの過去30日間の平均よりも50%長いジョブ インスタンスを検出します。この手法を使用して、CPU時間、I/Oなどのその他の値の異常を検出することができます。
- 過去30日間以内に終了したジョブについてDBQLUtilityTblから行を選択し、それらをLast30dayJobInstancesという一時テーブルに格納します。
CREATE VOLATILE TABLE Last30dayJobInstances AS (SELECT U.*, SUBSTRING(UtilityRequest FROM 1 FOR 100) AS UtilReqShort FROM DBC.DBQLUtilityTbl U WHERE CAST(JobEndTime AS date) >= DATE-30) WITH DATA PRIMARY INDEX (UtilityName, UserName) ON COMMIT PRESERVE ROWS;
- Last30dayJobInstancesテーブルを使用して、ユーティリティ名、ユーザー名、ユーティリティ リクエストなどの属性によってグループ化されている各ジョブの過去30日間の平均の経過時間を計算します。その結果をLast30dayAverageという別の一時テーブルに格納します。各行には、平均経過時間とジョブ属性が含まれます。
CREATE VOLATILE TABLE Last30dayAverage AS (SELECT AVERAGE((JobEndTime - JobStartTime) HOUR TO SECOND) AS AvgJobElapsedTime, UtilityName, UserName, SUBSTRING(UtilityRequest FROM 1 FOR 100) AS UtilReqShort FROM Last30dayJobInstances J GROUP BY UtilityName, UserName, SUBSTRING(UtilityRequest FROM 1 FOR 100)) WITH DATA PRIMARY INDEX (UtilityName, UserName) ON COMMIT PRESERVE ROWS;
- その経過時間が平均よりも50%多いジョブ インスタンスをLast30dayJobInstancesテーブルとLast30dayAverageテーブルを使用して選択します。
SELECT I.* FROM Last30dayJobInstances I, Last30dayAverage A WHERE I.UtilityName = A.UtilityName AND I.UserName = A.UserName AND I.UtilReqShort = A.UtilReqShort AND ( (EXTRACT(HOUR FROM ((I.JobEndTime - I.JobStartTime) HOUR TO SECOND)) * 3600) + (EXTRACT(MINUTE FROM ((I.JobEndTime - I.JobStartTime) HOUR TO SECOND)) * 60) + (EXTRACT(SECOND FROM ((I.JobEndTime - I.JobStartTime) HOUR TO SECOND))) ) > ( ((EXTRACT(HOUR FROM A.AvgJobElapsedTime) * 3600) + (EXTRACT(MINUTE FROM A.AvgJobElapsedTime) * 60) + (EXTRACT(SECOND FROM A.AvgJobElapsedTime)) ) * 1.5);
容量計画
このシナリオでは、過去12か月間のユーティリティごとの月単位の値を計算します。
- ジョブ インスタンスの数
- 平均ジョブ経過時間
- 処理容量合計(バイト数および行数)
- 平均処理容量
- 平均スループット(行/秒、バイト/秒)
SELECT TRUNC(CAST(JobEndTime AS DATE), 'RM') JobMonth, UtilityName, COUNT(*) AS NumJobs, AVG( (EXTRACT(HOUR FROM ((JobEndTime - JobStartTime) HOUR TO SECOND)) * 3600) + (EXTRACT(MINUTE FROM ((JobEndTime - JobStartTime) HOUR TO SECOND)) * 60) + (EXTRACT(SECOND FROM ((JobEndTime - JobStartTime) HOUR TO SECOND))) ) AS AvgJobTime, SUM(RowsInserted), AVG(RowsInserted), SUM(RowsUpdated ), AVG(RowsUpdated ), SUM(RowsDeleted ), AVG(RowsDeleted ), SUM(RowsExported), AVG(RowsExported), SUM(Phase1ByteCount), AVG(Phase1ByteCount), SUM(Phase2ByteCount), AVG(Phase2ByteCount), AVG(RowsInserted) / AvgJobTime AS InsRowsPerSec, AVG(RowsUpdated ) / AvgJobTime AS UpdRowsPerSec, AVG(RowsDeleted ) / AvgJobTime AS DelRowsPerSec, AVG(RowsExported) / AvgJobTime AS ExpRowsPerSec, AVG(Phase1ByteCount) / AvgJobTime AS AvgPhase1BytesPerSec, AVG(Phase2ByteCount) / AvgJobTime AS AvgPhase2BytesPerSec FROM (SELECT * FROM DBC.DBQLUtilityTbl U WHERE CAST(JobEndTime AS DATE) >= ADD_MONTHS(TRUNC(CURRENT_DATE, 'RM'), -12) AND CAST(JobEndTime AS DATE) < TRUNC(CURRENT_DATE, 'RM') ) AS OneYearLog GROUP BY JobMonth, UtilityName ORDER BY JobMonth, UtilityName;