优化查询,因此它不需要排名前N的排序

时间:2013-11-14 16:08:38

标签: sql sql-server-2008 indexing

我有以下查询

select top 25
    tblSystem.systemName,
    tblCompany.name
from 
    tblSystem
    join tblCompany
        on tblSystem.fkCompanyID = tblCompany.pkCompanyID
order by
    tblSystem.systemName, 
    tblCompany.name

在图片中生成第一个执行计划,第二个是没有order by的相同查询 enter image description here
有没有办法可以通过以特定方式索引表来摆脱TOP N Sort(因此只需要TOP)?

2 个答案:

答案 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)进行排序。

enter image description here

答案 1 :(得分:0)

你可以通过覆盖索引来摆脱它,其中包含已经按systemName ASC排序的行,名称为ASC,但我怀疑你是微观优化。这个查询速度慢吗?如果速度很快,那么“前N种排序”占用“一半时间”的事实并不重要。如果它很慢,我会更关注指数扫描,即使它被列为4%。