计算此数据的最佳方式

时间:2009-09-10 23:17:13

标签: sql performance case

简而言之,我有两张桌子:

USERS:

------------------------
UserID   |   Name
------------------------
0     a
1     b
2     c

CALLS:
------------------------
ToUser   |   Result
------------------------
0     ANSWERED
1     ENGAGED
1     ANSWERED
0     ANSWERED

Etc等(我在现实中使用数字参考结果)

我有超过200万条记录,每条记录详细说明了对特定客户的呼叫。目前我正在使用Case语句来计算特定结果的每次计算后我已经完成了快速总计数:

COUNT(DISTINCT l_call_log.line_id),
COALESCE (SUM(CASE WHEN l_call_log.line_result = 1 THEN 1 ELSE NULL END), 0) AS [Answered],
COALESCE (SUM(CASE WHEN l_call_log.line_result = 2 THEN 1 ELSE NULL END), 0) AS [Engaged], 
COALESCE (SUM(CASE WHEN l_call_log.line_result = 4 THEN 1 ELSE NULL END), 0) AS [Unanswered]

在我的初始总数之后,我是否对数据进行了3次扫描?如果是这样,有没有办法可以一次扫描并按顺序计算每次调用的次数?

感谢。

3 个答案:

答案 0 :(得分:0)

SQL中有GROUP BY构造。尝试:

SELECT COUNT(DISTINCT l_call_log.line_id)
  GROUP BY l_call_log.line_result

答案 1 :(得分:0)

我猜它是一个表扫描,因为你没有任何依赖子查询。对查询运行说明以确定。

答案 2 :(得分:0)

这将需要一次全表扫描。

编辑:没有足够的信息可以回答;因为我之前错过了重复删除(DISTINCT),我们不知道将使用什么策略....特别是在不知道数据库引擎的情况下。

在几乎每个主要查询引擎中,每个每行每个列执行一次聚合函数,并且它可以使用缓存结果(例如COUNT(*))。

是否对line_result编制了索引?如果是这样,您可以利用更好的查询(GROUP BY + COUNT(*)来利用索引统计信息,但我不确定这是否值得,具体取决于查询中的其他表。