简单的数据 - 我只需要简单的分析方法

时间:2009-04-25 20:15:22

标签: .net asp.net database reporting analysis

摘要

我正在就使用SQL服务器和.net

分析简单数据的最简单方法提出一些建议

详细

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

我有一个SQL Server表:

  • PKID(Int)
  • ApplicationName(VarChar)
  • MethodName(VarChar)
  • TimeInMs(整数)
  • AdditionalInfo(VarChar)
  • DateTime(DateTime)

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

select count(*) from table_name where ApplicationName = "BAR.EXE";

select sum(TimeInMs) from table_name group by ApplicationName;

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

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

答案 1 :(得分:0)

我认为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();

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

<强>更新 在回答评论中的后续问题时:

我想不出一个好方法来处理它,通过将所需的时间间隔存储在另一个没有严重困难的表中(游标和通过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