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

时间:2012-11-21 12:00:00

标签: sql-server performance entity-framework

我在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毫秒内完成,如预期的那样。

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

我可以使用内部选择,如下所示,强制引擎首先获取行然后排序,这将在~6 ms内返回行,但由于我们使用的是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

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

1 个答案:

答案 0 :(得分:1)

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

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