0

概括

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

细节

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

我有一个 SQL Server 表:

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

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

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

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

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

4

2 回答 2

1

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

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

select sum(TimeInMs) from table_name group by ApplicationName;

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

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

于 2009-04-25T20:17:53.183 回答
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
于 2009-04-25T21:28:09.957 回答