Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从多个表中计数更高效的SQL_Sql Server_Sqlperformance - Fatal编程技术网

Sql server 从多个表中计数更高效的SQL

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

我有一个非常慢的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.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.is
PodID
?如果是这样,“左连接”应该是一个
内部连接
,因为
的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