我正在就使用SQL服务器和.net
分析简单数据的最简单方法提出一些建议非常简单的数据 - 只需要非常简单的分析方法(用我的简单大脑)
我有一个SQL Server表:
此表记录了各种方法在各种应用程序中运行所花费的时间。该表可能有数万行。我想从中轻松提取有用的信息(其中一些是实时的)。我不确定最好的办法。我希望这种数据是:
数据 - 方法调用的平均时间长度 - 十大最慢的方法调用 - 十大最快的方法调用
以下期间: - 最后一分钟,小时,天,周,月 - 过去7天的每一天,过去10周的每周
对于应用程序: - 全部 - 每个人
答案 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