0

プロセスとその結果に添付できる汎用ログ テーブルがあります。プロセス パフォーマンス ビューを使用して平均時間を取得します。

WITH    Events
          AS (
              SELECT    PR.DATA_DT_ID
                       ,P.ProcessID
                       ,P.ProcessName
                       ,PL.GUID
                       ,PL.EventText
                       ,PL.EventTime
              FROM      MISProcess.ProcessResults AS PR
              INNER JOIN MISProcess.ProcessResultTypes AS PRT
                        ON PRT.ResultTypeID = PR.ResultTypeID
                           AND PRT.IsCompleteForTiming = 1
              INNER JOIN MISProcess.Process AS P
                        ON P.ProcessID = PR.ProcessID
              INNER JOIN MISProcess.ProcessLog AS PL
                        ON PL.BatchRunID = PR.BatchRunID
                           AND PL.ProcessID = P.ProcessID
                           AND [GUID] IS NOT NULL
                           AND (
                                PL.EventText LIKE 'Process Starting:%'
                                OR PL.EventText LIKE 'Process Complete:%'
                               )
             )
SELECT  Start.DATA_DT_ID
       ,Start.ProcessName
       ,AVG(DATEDIFF(SECOND, Start.EventTime, Finish.EventTime)) AS AvgDurationSeconds
       ,COUNT(*) AS NumRuns
FROM    Events AS Start
INNER JOIN Events AS Finish
        ON Start.EventText LIKE 'Process Starting:%'
           AND Finish.EventText LIKE 'Process Complete:%'
           AND Start.DATA_DT_ID = Finish.DATA_DT_ID
           AND Start.ProcessID = Finish.ProcessID
           AND Start.GUID = Finish.GUID
GROUP BY Start.DATA_DT_ID
       ,Start.ProcessName

GUID は、開始エントリと終了エントリを他の "メモ" スタイルのエントリにリンクします。

これをフィルタリングして古い月の実行を除外できるようになったので、プロセスの平均パフォーマンスは、たとえば過去 3 か月間のみ取得できます。

問題は、プロセスが 0 秒などで完了するパフォーマンスやデバッグが原因で異常値が発生した場合に発生します。

どうにかして外れ値を自動的に排除したいと思います。

VAR()またはSTDEV()集計関数は機能しますか?

4

2 に答える 2

4

集計関数は NULL を無視します ( を除くCOUNT(*))。したがって、式で外れ値を NULL に変換できる場合は、それが役立ちます。

AVG( CASE WHEN Start.EventTime = Finish.EventTime THEN NULL
     ELSE DATEDIFF(SECOND, Start.EventTime, Finish.EventTime) 
     END CASE )
于 2009-06-09T23:16:21.330 に答える
0

クエリを詳細に解析することなく、私の最初のアイデアは次のとおりです。

  • テーブル変数(またはtemptable)にクエリを実行します
  • 外れ値を定義するために使用するメトリックを使用して、テーブルから外れ値を削除します
  • このメトリックは、固定しきい値を下回るまたは上回るすべての値を削除するだけの可能性があります
  • および/または最初に平均値と標準偏差を計算し、次に平均値から標準偏差 x を超えるすべてのエントリを削除します
  • 次に、クリーンな temptable でさらに分析を行います
于 2009-06-09T23:19:11.030 に答える