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