【问题标题】:Simple data - I just need simple way to analyze简单的数据——我只需要简单的分析方法
【发布时间】:2009-04-25 20:15:22
【问题描述】:

总结

我正在寻求一些关于使用 SQL Server 和 .net 分析简单数据的最简单方法的建议

详情

非常简单的数据——只需要非常简单的方法来分析(用我简单的大脑)

我有一个 SQL Server 表:

  • PKID(整数)
  • 应用程序名称 (VarChar)
  • 方法名 (VarChar)
  • TimeInMs(整数)
  • 附加信息 (VarChar)
  • 日期时间(日期时间)

此表记录了各种方法在各种应用程序中运行所花费的时间长度。该表可能有数万行。我想轻松地从中提取有用的信息(其中一些是实时的)。我不确定解决此问题的最佳方法。我想要的这种数据是:

数据 - 方法调用的平均时间长度 - 十大最慢的方法调用 - 十大最快的方法调用

在以下期间: - 最后一分钟、一小时、一天、一周、一个月 - 过去 7 天的每一天,过去 10 周的每周

对于应用程序: - 全部 - 每个单独

【问题讨论】:

    标签: .net asp.net database reporting analysis


    【解决方案1】:

    如果不添加时间戳信息,您将无法进行有意义的分析。您最多可以创建查询来汇总应用程序性能的统计信息。

    select count(*) from table_name where ApplicationName = "BAR.EXE";
    
    select sum(TimeInMs) from table_name group by ApplicationName;
    

    除了编写代码来划分这些数字之外,您不能做太多事情。

    更新:使用时间戳信息,您可以调整上述示例的 where 子句以选择您感兴趣的范围。鉴于您的问题不准确,我可能建议将数据导入 Excel(我没有安装 Excel)并以各种方式按摩数据,而不是直接弄乱 SQL。

    【讨论】:

    • 有一个 DateTime 列(我的示例中错过了它)。如果这被证明有用,添加时间戳列也很容易。为了清楚起见,我已将它们添加到我上面的帖子中。
    • 你有一种简单的方法来对数据库运行 sql 吗?
    【解决方案2】:

    我认为 ojblass 指的是您从问题中省略的 DataTime 字段。

    MS SQL Server 中的实际时间戳数据类型在名称上具有误导性。它与日期和时间无关。它是一个二进制“版本号”。它主要用于在更新表中的行时处理并发问题,但对于任何分析任务都无用。

    我建议稍微改进一下您的列名。调用列“DateTime”会造成混淆,如果您不小心,可能会在编写查询时遇到一些麻烦。

    无论如何...如果直接用 TSQL 编写,您要查找的查询范围从简单到相当复杂。

    这里有一些例子(我没有对这些进行语法检查,所以它们充其量是“近似的”):

    特定方法的平均时间

    select avg(TimeInMs) as AvgTime from Table 
    where ApplicaitonName = @ApplicationName
    

    过去 1 分钟内特定方法的平均时间

    select avg(TimeInMs) as AvgTime from Table 
    where ApplicaitonName = @ApplicationName and 
        [DateTime] >= DATEADD(minute, -1, getdate())
    

    您最终会想要为其中的大多数编写存储过程。你谈论的一些查询也需要一些分组等等......如果你走这条路,我建议你买一本关于 TSQL 的书。

    如果您在应用程序中使用 LINQ to SQL 执行此操作,则没有太大不同,但通常 LINQ 更容易编写(当然值得商榷)。

    这是在 C# 中使用 LINQ to SQL 的相同的两个查询(同样,我还没有测试过这些,所以我可能是轻微的语法错误)。

    var ctx = new MyDataContext();
    var q = (from item in ctx.Table
            where item.ApplicationName == "MyApplication"
            select item.TimeInMs).Average();
    
    
    var ctx = new MyDataContext();
    var q = (from item in ctx.Table
            where item.ApplicationName == "MyApplication" &&
                  item.DateTime <= DateTime.Now.AddMinutes(-1)
            select new item.TimeInMs).Average();
    

    您如何进行分析取决于您使用的技术以及您对结果的处理方式。

    更新: 回答 cmets 的后续问题:

    我想不出一种好的方法来处理它,方法是将所需的时间间隔存储在另一个不会变得非常困难的表中(游标和通过 Execture 命令动态构建的 TSQL)。

    获得您想要的结果的更简单的查询在 TSQL 中可能如下所示(我并不主张这是“最佳”方式,但它可以工作并且速度非常快)。

    select avg(TimeInMs) as AvgTime, 'Last 1 minute' as TimePeriod from Table 
    where ApplicaitonName = @ApplicationName and 
        [DateTime] >= DATEADD(minute, -1, getdate())
    union
    select avg(TimeInMs) as AvgTime, 'Last 2 minutes' as TimePeriod from Table 
    where ApplicaitonName = @ApplicationName and 
        [DateTime] >= DATEADD(minute, -2, getdate())
    -- //repeat union as many times as needed for each time period
    

    【讨论】:

    • 但是假设我想获得以下分钟数的方法的平均时间:1,2,3,4,5,6,7,8,9,10,20,30 ,40,50,60,120,240,360 有没有办法在另一个表中定义小步舞曲列表,然后进行某种连接以获得所有这些的结果?我现在可以看到如何获取简单的单条信息(感谢您的输入和链接示例)。我真的在追求一次获取“多个”数据的最佳方法(如分钟示例)。如此简单的数据集让我感到惊讶,这太难了!
    • 我修改了我的答案,包括一个你所问问题的例子。这里的问题是您想要的查询对于人的思维来说只是简单的,但从 SQL 的角度来看实际上是相当复杂的问题。 TSQL 中有一些方法可以编写非常复杂的选择,就像您更优雅地询问的那样,但是这样的答案远远超出了简单 SO 帖子可以合理回答的范围。如果您将来要做很多此类事情,我建议您进行一些有关高级 TSQL 的认真培训或阅读。
    猜你喜欢
    • 2011-10-25
    • 2021-10-20
    • 2012-05-24
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 2012-05-28
    • 1970-01-01
    相关资源
    最近更新 更多