7

我的 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 毫秒内返回行,但由于我们使用的是 EF,这不是一个好的解决方案我们(我们可以在内存中对结果进行排序,但是我们对一些生成带有排序的 SQL 代码的实体使用 LoadWith 选项,并且该代码也遇到了相同的“排序依据”问题)。

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

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

4

1 回答 1

1

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

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

于 2012-11-21T12:40:51.973 回答