我仍然是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-- 作为询问它的所有答案,我检查了它。机会和票证索引都是按比例提升的。
答案 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上有索引。