【问题标题】:Optimize query so it does not need a Top N sort优化查询,使其不需要 Top N 排序
【发布时间】:2013-11-27 18:04:34
【问题描述】:

我有以下问题

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)?

【问题讨论】:

  • 我不明白这个问题。为什么要在需要时删除TOP 25
  • @TimSchmelter 如果我删除 order byTOP 而不进行排序。我想知道我是否可以为不需要排序的表建立索引。
  • indexed view 可以工作,但在这种情况下,连接的单独表上的索引不会减轻排序的需要。

标签: sql sql-server-2008 indexing


【解决方案1】:

systemName 上为tblSystem 添加索引,包括fkCompanyID

create index IX_tblSystem_systemName 
  on tblSystem(systemName) include(fkCompanyID)

重写您的查询以在由systemName 排序的派生表中从tblSystem 中选择前25 个值(带关系),然后加入tblCompany 以获得您需要的25 个值。

取决于fkCompanyID 是否允许空值,您需要在派生表的 where 子句中过滤掉空值。

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

您仍然需要 top(n) 排序运算符,但它只会对您从与tblCompany 连接的派生表中获得的 25 行(+ 并列)进行排序。

【讨论】:

    【解决方案2】:

    您可以通过使用包含已按 systemName ASC、名称 ASC 排序的行的覆盖索引来摆脱它,但我怀疑您正在进行微优化。这个查询慢吗?如果它很快,那么“前 N 个排序”需要“一半时间”这一事实并不重要。如果它很慢,我会更关心索引扫描,即使它被列为 4%。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多