SQL Server查询优化程序执行计划“”提前终止语句的原因:TimeOut“

时间:2013-11-08 22:08:47

标签: sql sql-server sql-server-2008 sql-server-2008-r2

环境: Windows 2008 R2,SQL Server 2008 SP1

问题: 具有9个表的表内连接查询在实际执行计划中获得“提前终止语句的原因:TimeOut”。

分配了错误的内存授予。

排序是在tempdb而不是ram中完成的,即使有足够的ram可用。

在tempdb中完成排序时性能很慢。

考虑: 如果我从9个表中的一个表中删除,创建和删除其中一个索引,查询将再次获得完全优化,并且在具有完全性能的ram中完成排序。但是,只要我稍微修改一下查询,它就会再次失去完整的优化。

问题: 有没有人见过这个问题?

有没有办法获得有关“超时”发生原因的更多信息?

优化器到底在做什么?

如果没有解决方案如何批准查询优化器问题,我会考虑为tempdb创建一个ramdisk。使用ramdisk对tempdb有什么风险?

我已经尝试过的事情: 更新{ALL 9 Tables} WITH FULLSCAN

的统计数据

INDEX REBUILD像我上面做的DROP CREATE DROP操作一样暂时工作。

2 个答案:

答案 0 :(得分:0)

可能是您的索引变得支离破碎。如果您要插入/删除/更新9个表,可能会发生这种情况。

示例te重建索引:

ALTER INDEX MyIndex ON MyTable REBUILD

一段时间后,插入/删除/更新将再次对索引进行分段。您可以安排重建以防止性能降低。例如,见:

http://technet.microsoft.com/en-us/library/ms180074(v=sql.100).aspx

答案 1 :(得分:0)

这是一篇讨论此问题的文章:https://blogs.msdn.microsoft.com/psssql/2018/10/19/understanding-optimizer-timeout-and-how-complex-queries-can-be-affected-in-sql-server/

  

有什么症状?

     

以下是其中涉及的一些因素:您有一个复杂的查询,   涉及很多联接表(例如,8个或更多表   加入)。

请注意,将大量表联接在一起意味着有许多可能的联接顺序可供SQL考虑。

可能的解决方案之一是使用临时表分解为中间查询;另一个是自己确定最佳连接顺序,并使用提示FORCEORDER。