Sql server 从多个表中计数更高效的SQL
我有一个非常慢的SQL语句,我相信我可以使用条件count()语句优化它,但我不知道如何做到这一点Sql server 从多个表中计数更高效的SQL,sql-server,sqlperformance,Sql Server,Sqlperformance,我有一个非常慢的SQL语句,我相信我可以使用条件count()语句优化它,但我不知道如何做到这一点 SELECT TOP 10 U.UserID, U.Fullname, U.URL, U.Fname, U.ProfilePic, (SELECT Count(ResourceID) FROM resources R WHERE R.UserID = U
SELECT TOP 10 U.UserID,
U.Fullname,
U.URL,
U.Fname,
U.ProfilePic,
(SELECT Count(ResourceID)
FROM resources R
WHERE R.UserID = U.UserID) AS ResourcesPosted,
(SELECT Count(JobID)
FROM Jobs J
WHERE J.UserID = U.UserID) AS JobsPosted,
(SELECT Count(AuditID)
FROM Audit_Trail AT
WHERE AT.UserID = U.UserID
AND TYPE = 1
AND Entry LIKE '%logged in%') AS TotalLogins,
(SELECT Count(EventID)
FROM Future_Events_Listing E
WHERE E.UserID = U.UserID) AS EventsPosted
FROM User_basics U
LEFT JOIN Pod_Membership PM ON PM.userID = U.UserID
WHERE PodID = 268
我是否可以进行某种内部联接,然后有条件地对项目进行计数?使用“解释”来了解查询是如何执行的
如果不使用索引,请为表编制索引。作为一般规则,在WHERE子句中包含的任何字段上放置索引。使用“解释”来了解查询是如何执行的
如果不使用索引,请为表编制索引。一般来说,将索引放在WHERE子句中包含的任何字段上。如果没有查询计划,很难准确地看到瓶颈在哪里。最可能的问题是,在您正在执行
计数的表中,UserID
上没有索引。如果是这种情况,那么您的查询将导致对每个用户的每个表进行完整的表扫描。因此,下面的查询可能有助于避免这种情况,因为它只会对每个表执行一次表扫描(虽然索引UserID是最好的解决方案,因为这只会导致在每个表上进行索引查找-审计跟踪可能除外,因为您可能需要在索引中包含类型
和条目
,以避免可能非常昂贵的键查找):
因此:
< p > 1)如果在任何或所有表中没有“代码> USERID < /代码>的索引,则考虑添加一个。
2) 如果Audit\u Trail
上有UserID
的索引,则可能需要添加条目
和类型
作为包含列,以避免键查找。您需要检查查询计划来评估这一点。如果没有查询计划,很难准确地看到瓶颈在哪里。最可能的问题是,在您正在执行计数的表中,UserID
上没有索引。如果是这种情况,那么您的查询将导致对每个用户的每个表进行完整的表扫描。因此,下面的查询可能有助于避免这种情况,因为它只会对每个表执行一次表扫描(虽然索引UserID是最好的解决方案,因为这只会导致在每个表上进行索引查找-审计跟踪可能除外,因为您可能需要在索引中包含类型
和条目
,以避免可能非常昂贵的键查找):
因此:
< p > 1)如果在任何或所有表中没有“代码> USERID < /代码>的索引,则考虑添加一个。
2) 如果Audit\u Trail
上有UserID
的索引,则可能需要添加条目
和类型
作为包含列,以避免键查找。您需要检查查询计划以评估这一点。是否在Pod\u成员资格表中podd
?如果是这样,“左连接”应该是一个内部连接
,因为的WHERE
会将它变成这样。@strickt01谢谢,我现在已经这样做了。您正在执行计数
的表上是否有用户ID索引-这可能是您的问题?如果用户ID以外的其他表之间没有关联,则计数
上没有条件,您可以应用WHERE
子句中已有的条件以外的条件,即Pod_成员资格
表中的UserID.isPodID
?如果是这样,“左连接”应该是一个内部连接
,因为的WHERE
会将它变成这样。@strickt01谢谢,我现在已经这样做了。您正在执行计数
的表上是否有用户ID索引-这可能是您的问题?如果用户ID以外的其他表之间没有关联,则COUNT
上没有任何条件,您可以应用WHERE
子句中已有的条件以外的条件-即用户ID。
SELECT TOP 10 U.UserID,
U.Fullname,
U.URL,
U.Fname,
U.ProfilePic,
ResourcesPosted,
JobsPosted,
TotalLogins,
EventsPosted
FROM User_basics U
INNER JOIN Pod_Membership PM ON PM.userID = U.UserID
AND PodID = 268
LEFT OUTER JOIN
(SELECT R.UserID, Count(ResourceID) AS ResourcesPosted
FROM resources R
GROUP BY R.UserID) res
ON res.UserID = U.UserID
LEFT OUTER JOIN
(SELECT J.UserID, Count(JobID) AS JobsPosted
FROM Jobs J
GROUP BY J.UserID ) job
ON job.UserID = U.UserID
LEFT OUTER JOIN
(SELECT AT.UserID, Count(AuditID) AS TotalLogins
FROM Audit_Trail AT
WHERE TYPE = 1
AND Entry LIKE '%logged in%'
GROUP BY AT.UserID) aud
ON aud.UserID = U.UserID
LEFT OUTER JOIN
(SELECT E.UserID, Count(EventID) AS EventsPosted
FROM Future_Events_Listing E
GROUP BY E.UserID) fut
ON fut.UserID = U.UserID