我在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
我已经测试了一些索引是已排序的列,这是固定的东西,但只是因为列已经排序了。看起来像一个笨重的解决方案...
答案 0 :(得分:1)
首先,我不知道它为什么这样做!话虽如此,这里有一些你可能已经尝试过的事情。
查询提示:
您是否尝试过使用此处记录的各种查询提示? http://msdn.microsoft.com/en-us/library/ms181714.aspx。特别是RECOMPILE
选项。
DBCC FREEPROCCACHE和DBCC DROPCLEANBUFFERS的常规步骤如何?这些是我经常尝试的事情。
更新统计信息:运行UPDATE STATISTICS tablename
或EXEC sp_updatestats
更新整个数据库的统计信息。
最后,也许在你的情况下不相关,但这里有一个很好的解释表格提示:http://blog.sqlauthority.com/2009/11/19/sql-server-understanding-table-hints-with-examples/