我能够找到有关我的查询的similar和close-match个问题。但我想知道是否有更好的方法来做同样的事情。
我有一个数据库表,通过调用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
的详细信息,请here。
鉴于:
- 数据实时输入表格
- 表将存储大量数据。 10,00,000多条记录
- 报告查询的结构不会改变
- 数据将按类别,日期和日期过滤(所有都是可选参数)
- 时间不相关,只有日期部分
醇>
运行定期运行的计划任务并使用MyTbl
的值更新新表是不是一个好主意?新表看起来与报表查询类似:
Date | Category | Sent | Received | Blocked | Opened
将通过应用类别和日期过滤器来查询此表。
这种方法的否定:
- 我们仍需要每天维护数据
- 我们仍然需要应用GROUP BY和SUM
- 可能需要比原始方法更多的数据库操作
- 我们无法获得所有实时数据。
醇>
这种方法的积极因素:
- 可以加速从数据库中取出的记录,这可以加快显示,排序和分页的过程。
醇>
这是一种可行的方法吗? 还有其他方法可以加快这个过程吗?请帮忙!
答案 0 :(得分: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