SQL:计算系统负载统计信息

时间:2009-05-19 17:50:03

标签: sql statistics load

我有一个这样的表来存储通过系统发送的消息:

Message
-------
ID (bigint)
CreateDate (datetime)
Data (varchar(255))

我被要求计算峰值负载下每秒保存的消息。我真正需要处理的唯一数据是CreateDate。系统上的负载并不是一成不变的,有时候我们会得到大量的流量,而且我们的流量很少。我认为这个问题有两个部分:1。确定被认为是峰值负载的时间范围,2。计算这些时间内每秒的平均消息。

这是正确的做法吗? SQL中有什么东西可以帮助解决这个问题吗?任何提示将不胜感激。

3 个答案:

答案 0 :(得分:2)

我同意,在开始创建报告之前,你必须弄清楚峰值负载是什么。

我要做的第一件事是弄清楚我将如何定义峰值负载。防爆。我要看一小时一小时的故障。

接下来,我将在几秒钟内完成CreateDate的组(没有milleseconds)。作为小组的一部分,我会根据记录的数量进行平均。

答案 1 :(得分:1)

警告,这些会运行缓慢!

这会将您的数据分组到“第二个”存储桶中,并将它们从最活动的列表中列为最少:

SELECT
    CONVERT(char(19),CreateDate,120) AS CreateDateBucket,COUNT(*) AS CountOf
    FROM Message
    GROUP BY CONVERT(Char(19),CreateDate,120)
    ORDER BY 2 Desc

这会将您的数据分组为“分钟”存储桶,并将其从最活动的列表中列为最少:

SELECT
    LEFT(CONVERT(char(19),CreateDate,120),16) AS CreateDateBucket,COUNT(*) AS CountOf
    FROM Message
    GROUP BY LEFT(CONVERT(char(19),CreateDate,120),16)
    ORDER BY 2 Desc

我会接受这些值并计算他们想要的东西

答案 2 :(得分:1)

我认为你不需要知道高峰时段;您可以使用SQL生成它们,包装完整查询并选择前20个条目,例如:

select top 20 *
from (
     [...load query here...]
) qry
order by LoadPerSecond desc

This answer对平均值有一个很好的教训。您可以通过查看每小时的负载并除以3600来计算每秒的负载。

为了第一眼看到上周的负载,您可以尝试(Sql Server语法):

select datepart(dy,createdate) as DayOfYear,
       hour(createdate) as Hour, 
       count(*)/3600.0 as LoadPerSecond
from message
where CreateDate > dateadd(week,-7,getdate())
group by datepart(dy,createdate), hour(createdate)

要查找每分钟的峰值负载:

select max(MessagesPerMinute)
from (
  select count(*) as MessagesPerMinute
  from message
  where CreateDate > dateadd(days,-7,getdate())
  group by datepart(dy,createdate),hour(createdate),minute(createdate)
)

按日期部分(dy,...)分组是一种区分日期而不用担心月份边界的简单方法。它可以工作,直到你在一年前选择更多,但这对于性能查询来说是不寻常的。