从多个表

时间:2016-04-01 11:26:24

标签: sql-server sqlperformance

我有一个非常慢的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

我可以进行某种内连接,然后有条件地计算项目吗?

2 个答案:

答案 0 :(得分:0)

使用"解释"找出查询是如何执行的。

如果它没有使用索引,请为表索引。作为一般规则,在WHERE子句中包含的任何字段上放置索引。

答案 1 :(得分:0)

如果没有查询计划,很难确定瓶颈的确切位置。最可能的问题是,您正在执行UserID的表中的COUNT上没有索引。如果是这种情况,那么您的查询将导致每个用户在每个表上进行全表扫描。因此,以下查询可能有助于避免这种可能性,因为它将为每个表执行一次表扫描(尽管索引UserID是最佳解决方案,因为这应该只会导致每个表上的索引搜索 - 可能会有例外,因为您可能会使用Audit_trail需要在索引中包含TypeEntry,以避免可能非常昂贵的密钥查找):

 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的索引,那么您可能需要将EntryType添加为包含的列,以避免键查找。您需要检查查询计划以评估此情况。

相关问题