17.00 - 17.05 - DBQLユーティリティ ジョブ ログ テーブルの使用例 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - データベースの管理

Product
Advanced SQL Engine
Teradata Database
Release Number
17.00
17.05
Release Date
2020年6月
Content Type
管理
Publication ID
B035-1093-170K-JPN
Language
日本語 (日本)

DBQLUtilityLogTblを使用して、ユーティリティ パフォーマンスの問題を診断し、容量計画を行なうことができます。以下に、テーブルの使用例をいくつか挙げます。

今日実行したジョブにいつもより時間がかかった理由の調査

このシナリオでは、今日実行したFastLoadジョブに昨日よりかなり時間がかかりました。その根本的な理由を追求します。例はFastLoad固有ですが、この一般的な手法をその他のユーティリティに使用することができます。

  1. 以下の基準を使用して、DBQLUtilityTblから昨日と今日のジョブの行を取得します。
    • このFastLoadジョブを固有に識別するジョブ属性。この基準はこのFastLoadジョブのすべてのインスタンスを返します。可能なジョブ属性は以下のとおりです。
      • UtilityName = 'FASTLOAD'
      • ユーザー名
      • クエリー バンド
      • ユーティリティ リクエスト
    • ジョブ終了時刻:今日または昨日。
  2. 2つの行のさまざまな列値を比較し、可能な原因を追究します。提案には以下が含まれます。
    1. RowsInserted値を比較します。今日のジョブで昨日より非常に多くの行をロードした場合、これが原因である可能性があります。そうでない場合、次のステップを続行します。
    2. DelayTime値を比較します。増加は、今日のジョブが昨日よりTASMによって遅れたことを示します。
    3. 各フェーズの経過時間(PhasexEndTime - PhasexStartTime)を比較し、経過時間に大きな増加のあるフェーズを特定します。
    4. 経過時間に大きな増加のあるフェーズが取得フェーズである場合、 MaxDataWaitTimeの増加を確認します。クライアント マシンでのより多くのロード、またはより遅いネットワーク応答時間が原因である場合があります。
    5. 経過時間に大きな増加のあるフェーズのリソース利用を比較して、追加のヒントを見つけます。例えば、次のようになります。
      • PhasexMaxCPUTimeの増加はデータ スキューを示すことがあります。
      • Phase1メッセージ(Phase1BlockCount)の増加は、より小さなメッセージ サイズが使用されたことを示すことがあります。
  3. DBQLogTblの関連する問合せログ データを確認します。必要なデータを選択するには、以下を使用します。
    • 特定のジョブのすべての行を選択するLSN。
    • 特定のフェーズの行を選択するPhasexStartTimeおよびPhasexEndTime。

性能異常の検出

このシナリオでは、経過時間が同じジョブの過去30日間の平均よりも50%長いジョブ インスタンスを検出します。この手法を使用して、CPU時間、I/Oなどのその他の値の異常を検出することができます。

  1. 過去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;
  2. 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;
  3. その経過時間が平均よりも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;