代码之家  ›  专栏  ›  技术社区  ›  Andy White

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

  •  1
  • Andy White  · 技术社区  · 17 年前

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

    我被要求计算在峰值负载下每秒保存的邮件数。我真正需要处理的唯一数据是CreateDate。系统上的负载不是恒定的,有时我们得到大量的流量,有时我们得到很少的流量。我认为这个问题有两个方面:1。确定被视为峰值负荷的时间范围,2。计算这些时间内每秒的平均消息数。

    这是正确的方法吗?SQL中有什么东西可以帮助实现这一点吗?任何提示都将不胜感激。

    3 回复  |  直到 17 年前
        1
  •  2
  •   Jeff    17 年前

    我同意,在开始创建报告之前,您必须先确定峰值负载是多少。

    接下来,我将在CreateDate上进行分组,格式为秒(无秒)。作为小组的一部分,我会根据记录的数量做一个平均值。

        2
  •  1
  •   KM.    17 年前

    警告,这些将运行缓慢!

    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
    

    我会取这些值并计算它们想要什么

        3
  •  1
  •   Community Mohan Dere    9 年前

    我认为你不需要知道高峰时间;您可以使用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)
    )
    

    按datepart(dy,…)分组是区分日期的一种简单方法,无需担心月份边界。它会一直工作到您选择一年多以前,但这对于性能查询来说是不寻常的。