我仍然是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)。select中的select是正确的方式,还是可以使用group by之类的东西来完成。
我最关心的是速度,仅提取20条记录需要3-5秒,查询可能会有1000个结果。
我不是DBA,因此对表模式的任何更改都不是不可能的,但需要与上层管理人员进行一些恳求。
这是针对SQL Server 2000运行的。
编辑--因为所有关于它的答案我都检查过了。帐户on上的机会和票证索引都在上升。
发布于 2010-07-15 23:32:49
我认为下面的内容在逻辑上应该是等价的,并且更有效率。显然,这两个方面你都要测试一下!
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上存在索引,并且索引正在使用中。
发布于 2010-07-15 23:36:50
sql引擎(即使在2000年)也足够智能,可以优化SQL。根据结果如此之少的性能数据,我猜测源数据有一堆记录,并且没有sql所需的索引。
确保在Opportunity.AccountID和Ticket.AccountID上各有一个索引。
https://stackoverflow.com/questions/3257061
复制相似问题