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()orSTDEV()聚合函数会起作用吗?

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

在没有详细解析您的查询的情况下,我的第一个想法是:

  • 对表变量(或临时表)进行查询
  • 使用用于定义异常值的任何指标从表中删除异常值
  • 该指标可能只是删除低于或高于固定阈值的所有值
  • 和/或首先计算均值和标准偏差,然后从均值中删除超过 x 标准偏差的所有条目
  • 然后对清理后的 temptable 做进一步的分析
于 2009-06-09T23:19:11.030 回答