【发布时间】:2017-05-22 03:32:09
【问题描述】:
我有一个用于用户及其请求的简单数据模型:
User
- id,
- name
Request
- id,
- createdAt,
- completedAt,
- status
- userId (FK to user)
我正在尝试运行一个查询来收集每个用户的一些统计信息。问题是我必须运行相同的子查询来获取我选择的每个参数的用户请求。相反,我想运行一次,然后计算一些统计数据。
select
u.id as UserId,
(select count(*)
from Requests r
where userId = u.id
and timestamp > @dateFrom) as Total,
(select count(*)
from Requests r
where userId = u.id
and timestamp > @dateFrom
and status = N'Completed') as Completed,
(select status
from Requests r
where userId = u.id
and timestamp > @dateFrom
and status != N'Completed') as ActiveStatus,
(select datediff(second, createdAt, completedAt)
from Requests r
where userId = u.id
and timestamp > @dateFrom
and status == N'Completed') as AvgProcessingTime
from User u
显然,这个查询很慢,我需要对其进行优化。我尝试了加入、申请、排名,但对我来说没有任何效果(因为我无法完成所有必需统计信息的查询)。
从性能的角度来看,最好的方法是什么?
【问题讨论】:
-
应该可以使用左连接并应用聚合来获取计数
标签: sql sql-server tsql sql-server-2012 sqlperformance