0

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

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

该表如下所示:

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 schema提供有关和报告sample data的详细信息。select-query

鉴于:

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

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

Date | Category | Sent | Received | Blocked | Opened

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

这种方法的缺点:

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

这种方法的优点:

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

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

4

1 回答 1

2

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

您可能还需要考虑将查询重新配置为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
于 2013-08-06T08:33:58.883 回答