首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化sql计数查询

优化sql计数查询
EN

Stack Overflow用户
提问于 2010-07-15 23:23:30
回答 2查看 156关注 0票数 0

我仍然是SQL的新手,所以我想知道我是不是以最优化的方式做到了这一点。

代码语言:javascript
复制
 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)。select中的select是正确的方式,还是可以使用group by之类的东西来完成。

我最关心的是速度,仅提取20条记录需要3-5秒,查询可能会有1000个结果。

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

这是针对SQL Server 2000运行的。

编辑--因为所有关于它的答案我都检查过了。帐户on上的机会和票证索引都在上升。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-15 23:32:49

我认为下面的内容在逻辑上应该是等价的,并且更有效率。显然,这两个方面你都要测试一下!

代码语言:javascript
复制
 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上存在索引,并且索引正在使用中。

票数 2
EN

Stack Overflow用户

发布于 2010-07-15 23:36:50

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

确保在Opportunity.AccountID和Ticket.AccountID上各有一个索引。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3257061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档