我有一个非常慢的SQL语句,我相信我可以使用条件计数()语句进行优化,但我无法解决如何执行此操作。
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
我可以进行某种内连接,然后有条件地计算项目吗?
答案 0 :(得分:0)
使用"解释"找出查询是如何执行的。
如果它没有使用索引,请为表索引。作为一般规则,在WHERE子句中包含的任何字段上放置索引。
答案 1 :(得分:0)
如果没有查询计划,很难确定瓶颈的确切位置。最可能的问题是,您正在执行UserID
的表中的COUNT
上没有索引。如果是这种情况,那么您的查询将导致每个用户在每个表上进行全表扫描。因此,以下查询可能有助于避免这种可能性,因为它将为每个表执行一次表扫描(尽管索引UserID是最佳解决方案,因为这应该只会导致每个表上的索引搜索 - 可能会有例外,因为您可能会使用Audit_trail需要在索引中包含Type
和Entry
,以避免可能非常昂贵的密钥查找):
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
所以:
1)如果任何或所有表中的UserId
都没有索引,请考虑添加一个索引。
2)如果Audit_Trail
上有UserID
的索引,那么您可能需要将Entry
和Type
添加为包含的列,以避免键查找。您需要检查查询计划以评估此情况。