1

我有一个这样的表来存储来自系统的消息:

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

我被要求计算峰值负载下每秒保存的消息。我真正必须使用的唯一数据是 CreateDate。系统上的负载不是恒定的,有时我们会获得大量流量,而有时我们会获得很少的流量。我认为这个问题有两个部分:1.确定被认为是峰值负载的时间范围,2.计算这些时间段内每秒的平均消息。

这是正确的方法吗?SQL中是否有可以帮助解决这个问题的东西?任何提示将非常感谢。

4

3 回答 3

2

我同意,您必须先弄清楚峰值负载是什么,然后才能开始创建报告。

我要做的第一件事是弄清楚我将如何定义峰值负载。前任。我要逐小时查看细分吗?

接下来,我将对 CreateDate 进行分组,以秒(无毫秒)为单位。作为小组的一部分,我会根据记录数进行平均。

于 2009-05-19T17:56:36.757 回答
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

我会采用这些值并计算他们想要的

于 2009-05-19T19:10:12.513 回答
1

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

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

这个答案对平均值有很好的启示。您可以通过查看每小时负载并除以 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)
)

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

于 2009-05-19T21:24:33.817 回答