[英]Index with Leftouter join there is always Index scan in 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://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/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.