【问题标题】:Conditional Count and group by with realtime data使用实时数据进行条件计数和分组
【发布时间】:2013-08-07 03:57:01
【问题描述】:

我能够找到关于我的查询的similarclose-match 问题。但我想知道是否有更好的方法来做同样的事情。

我有一个通过调用网络服务端点来填充的数据库表。当某个事件发生并将新记录插入此表时,将调用端点。这些事件是实时发生的,没有固定的事件发生频率或模式。

表格如下:

CREATE TABLE MyTbl(id int, type nvarchar(10), timestamp datetime, category nvarchar(50));

我正在从表中获取数据:

SELECT category,
COUNT(CASE WHEN type = 'sent' THEN 1 END) sent,
COUNT(CASE WHEN type = 'received' THEN 1 END) received,
COUNT(CASE WHEN type = 'blocked' THEN 1 END) blocked,
COUNT(CASE WHEN type = 'opened' THEN 1 END) opened
FROM MyTbl
WHERE timestamp >= '2013-01-01 00:00:00' AND timestamp < '2013-02-01 00:00:00'
GROUP BY category

有关报告的database schemasample dataselect-query 的详细信息,请访问here

鉴于:

  1. 数据实时输入到表中
  2. 表将存储大量数据约。 10,00,000+ 条记录
  3. 报告查询的结构不会改变
  4. 数据将按类别、起始日期和终止日期过滤(均为可选参数)
  5. 时间无关,只有日期部分是

运行一个定期运行的计划任务并使用来自MyTbl 的值更新一个新表是个好主意吗?新表看起来类似于报告查询:

Date | Category | Sent | Received | Blocked | Opened

并且将通过应用类别和日期过滤器来查询此表。

这种方法的缺点:

  1. 我们仍然需要每天维护数据
  2. 我们还是要应用 GROUP BY 和 SUM
  3. 可能需要比原始方法更多的数据库操作
  4. 我们不会实时获取所有数据。

这种方法的优点:

  1. 可以加快从数据库中获取记录的速度,从而加快显示、排序和分页的过程

这是一种可行的方法吗? 有没有其他方法可以加快这个过程?请帮忙!

【问题讨论】:

  • 你也可以试试存储过程。它们的执行速度比 sql 查询快得多
  • @sourabhdevpura,这仅使用存储过程执行。我使用 SQL 查询使其变得简单。

标签: sql-server sql-server-2008-r2


【解决方案1】:

是的,这是一种可行的方法。

您可能还需要考虑将查询重新配置为PIVOT

select *
from 
    (select [date],category, [type] 
       from yourtable 
       where timestamp between '2013-01-01' and '2013-02-01') d
pivot 
(count (type) for [type] in (sent,blocked,received,opened)) p

【讨论】:

  • 谢谢!此查询的执行速度比原始查询快约 37 倍!我很难相信,但现在我知道这太棒了。再次感谢!
猜你喜欢
  • 2016-04-11
  • 2016-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 2016-09-14
  • 2016-08-08
  • 1970-01-01
相关资源
最近更新 更多