【发布时间】:2013-08-07 03:57:01
【问题描述】:
我能够找到关于我的查询的similar 和close-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 schema、sample data 和select-query 的详细信息,请访问here。
鉴于:
- 数据实时输入到表中
- 表将存储大量数据约。 10,00,000+ 条记录
- 报告查询的结构不会改变
- 数据将按类别、起始日期和终止日期过滤(均为可选参数)
- 时间无关,只有日期部分是
运行一个定期运行的计划任务并使用来自MyTbl 的值更新一个新表是个好主意吗?新表看起来类似于报告查询:
Date | Category | Sent | Received | Blocked | Opened
并且将通过应用类别和日期过滤器来查询此表。
这种方法的缺点:
- 我们仍然需要每天维护数据
- 我们还是要应用 GROUP BY 和 SUM
- 可能需要比原始方法更多的数据库操作
- 我们不会实时获取所有数据。
这种方法的优点:
- 可以加快从数据库中获取记录的速度,从而加快显示、排序和分页的过程
这是一种可行的方法吗? 有没有其他方法可以加快这个过程?请帮忙!
【问题讨论】:
-
你也可以试试存储过程。它们的执行速度比 sql 查询快得多
-
@sourabhdevpura,这仅使用存储过程执行。我使用 SQL 查询使其变得简单。
标签: sql-server sql-server-2008-r2