我有以下查询
select top 25
tblSystem.systemName,
tblCompany.name
from
tblSystem
join tblCompany
on tblSystem.fkCompanyID = tblCompany.pkCompanyID
order by
tblSystem.systemName,
tblCompany.name
在图片中生成第一个执行计划,第二个是没有order by
的相同查询
有没有办法可以通过以特定方式索引表来摆脱TOP N Sort
(因此只需要TOP
)?
答案 0 :(得分:5)
在包含tblSystem
的{{1}}上为systemName
添加索引。
fkCompanyID
重写您的查询以从create index IX_tblSystem_systemName
on tblSystem(systemName) include(fkCompanyID)
排序的派生表中选择来自tblSystem
的25个第一个值(带有关系),然后加入systemName
以获取所需的25个值。
根据tblCompany
是否允许空值,您需要在派生表的where子句中过滤掉空值。
fkCompanyID
您仍然需要top(n)排序运算符,但它只会对从select top (25)
S.systemName,
C.name
from (
select top (25) with ties
S.fkCompanyID,
S.systemName
from tblSystem as S
where S.fkCompanyID is not null
order by S.systemName
) as S
inner join tblCompany as C
on S.fkCompanyID = C.pkCompanyID
order by S.systemName,
C.name
加入的派生表中获得的25行(+ tie)进行排序。
答案 1 :(得分:0)
你可以通过覆盖索引来摆脱它,其中包含已经按systemName ASC排序的行,名称为ASC,但我怀疑你是微观优化。这个查询速度慢吗?如果速度很快,那么“前N种排序”占用“一半时间”的事实并不重要。如果它很慢,我会更关注指数扫描,即使它被列为4%。