优化sql Count Query

时间:2010-07-15 15:23:30

标签: sql-server-2000 count query-optimization

我仍然是SQL的新手,所以我想知道我是否采用最优化的方式。

 SELECT DISTINCT ACCOUNTID, ACCOUNT_NAME
  (SELECT        COUNT(*)
  FROM            TICKET
  WHERE        (ACCOUNTID = OPPORTUNITY.ACCOUNTID)) AS [Number Of Tickets],
  (SELECT        COUNT(*)
  FROM            TICKET
  WHERE        (ACCOUNTID = OPPORTUNITY.ACCOUNTID) AND (STATUSCODE = 1 OR
         STATUSCODE = 2 OR
         STATUSCODE = 3)) AS [Active Tickets]
 from OPPORTUNITY
    where AccountID > @LowerBound and AccountID < @UpperBound

我要做的是获取所有帐户的列表,并让它显示帐户有多少票证以及有多少票证(状态代码为1,2或3)。选择内部的选择是否正确,或者是否可以使用group by等方法完成。

我最关心的是速度,只需要3-5秒即可获得大约20条记录,查询可能会有1000条结果。

我不是DBA,因此对表模式的任何更改都不可行,但需要对高层管理人员进行一些恳求。

这是针对SQL Server 2000运行的。

EDIT-- 作为询问它的所有答案,我检查了它。机会和票证索引都是按比例提升的。

2 个答案:

答案 0 :(得分:2)

我认为以下内容应该在逻辑上相同且更有效。显然,测试两个方面你的结局!

 SELECT O.ACCOUNTID, O.ACCOUNT_NAME,
   COUNT(*) AS [Number Of Tickets],
   ISNULL(SUM(CASE WHEN STATUSCODE IN (1,2,3) THEN 1 ELSE 0 END),0) 
                                                                AS [Active Tickets]
 FROM OPPORTUNITY O
 LEFT OUTER JOIN TICKET T ON T.ACCOUNTID = O.ACCOUNTID
    WHERE O.ACCOUNTID > @LowerBound and O.ACCOUNTID < @UpperBound
    GROUP BY O.ACCOUNTID, O.ACCOUNT_NAME

如果您可以查看执行计划,那么您应检查两个表中的ACCOUNTID上是否存在索引并正在使用。

答案 1 :(得分:1)

SQL引擎(即使在2000年)足够聪明,可以优化sql。根据您的性能数据和如此少的结果,我猜测源数据有一堆记录,并且没有sql需要的索引。

确保Opportunity.AccountID上有索引,Ticket.AccountID上有索引。