繁体   English   中英

SQL Server 2005执行全表在索引扫描之前排序

[英]SQL Server 2005 doing full table Sort before Index Scan

我在SQL Server 2005数据库中订购性能时遇到问题。 可以说我有以下查询:

select 
    id, versionId, orderIndex
from Forms_Page
where
    versionId = 'AFCF4921-31B4-44C1-B3A7-913910F7600E'
order by
    orderIndex

此查询将返回7行并执行约23秒。 此查询的执行计划如下(无法发布图像):

选择(成本:0%) - >排序(成本:11%) - >聚集索引扫描(成本:89%)

如果我删除'order by'子句,查询将在~4 ms内完成,就像预期的那样。

为什么SQL Server在获取请求的行之前进行排序? 这对我来说没有意义。 为什么不首先获得7行并仅排序? 我是否遗漏了某些内容,例如数据库配置,或者这是预期的行为?

我可以使用内部选择,如下所示,强制引擎首先获取行然后排序,这将在~6毫秒内返回行,但由于我们使用的是EF,因此这不是一个好的解决方案。我们(我们可以在内存中对结果进行排序,但是我们正在为一些生成SQL代码的实体使用LoadWith选项,并且该代码也遇到了相同的“order by”问题)。

select *
from(
    select 
        id, versionId, orderIndex
    from Forms_Page
    where
        versionId = 'AFCF4921-31B4-44C1-B3A7-913910F7600E'
) T
order by
    T.orderIndex

我测试了一些索引是已排序的列,它固定了东西,但只是因为列已经排序。 看起来像一个笨重的解决方案......

首先,我不知道它为什么这样做! 话虽如此,这里有一些你可能已经尝试过的事情。

最后,也许在你的情况下并不相关,但这里有一个很好的解释表格提示: http//blog.sqlauthority.com/2009/11/19/sql-server-understanding-table-hints-with-examples/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM