Joã*_*ões 7 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
Run Code Online (Sandbox Code Playgroud)
此查询将返回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
Run Code Online (Sandbox Code Playgroud)
我测试了一些索引是已排序的列,它固定了东西,但只是因为列已经排序.看起来像一个笨重的解决方案......
首先,我不知道为什么要这么做!话虽如此,这里有一些您可能已经尝试过的事情。
查询提示:您是否尝试过使用此处记录的各种查询提示?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/
| 归档时间: |
|
| 查看次数: |
394 次 |
| 最近记录: |