SQL Server查询优化器执行计划“语句提前终止的原因:超时”

Posted

技术标签:

【中文标题】SQL Server查询优化器执行计划“语句提前终止的原因:超时”【英文标题】:SQL Server Query Optimizer Execution Plan ""Reason for Early Termination of Statement: TimeOut" 【发布时间】:2013-11-08 22:08:46 【问题描述】:

环境: Windows 2008 R2、SQL Server 2008 SP1

问题: 9表的表内连接查询在实际执行计划中得到“提前终止语句的原因:超时”。

分配了错误的内存授予。

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

在 tempdb 中进行排序时性能很慢。

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

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

有什么方法可以获取有关“超时”发生原因的更多信息吗?

优化器到底在做什么?

如果没有解决如何批准查询优化器问题的解决方案,我会考虑为 tempdb 制作一个 ramdisk。将 ramdisk 用于 tempdb 有哪些风险?

我已经尝试过的事情: 使用 FULLSCAN 更新 ALL 9 Tables 的统计数据

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

【问题讨论】:

如果您添加更详细的信息,例如实际查询计划本身,我们可以更好地回答这个问题。 【参考方案1】:

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

重建索引示例:

ALTER INDEX MyIndex ON MyTable REBUILD

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

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

【讨论】:

我实际上也做了索引重建。如果我保持查询相同,它会起作用,但只要我稍微更改查询就停止工作(比如更改 WHERE 子句中条件的顺序)。抱歉,我在原帖中放了更多信息。【参考方案2】:

这是一篇讨论这个问题的文章: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。

【讨论】:

以上是关于SQL Server查询优化器执行计划“语句提前终止的原因:超时”的主要内容,如果未能解决你的问题,请参考以下文章

SQL -- SQL Server 查询优化器(Query Optimizers)

sql server 统计信息

Sql Server 优化 SQL 查询:如何写出高性能SQL语句

谈一谈SQL Server中的执行计划缓存(下)

Sql Server中执行计划的缓存机制

引用:初探Sql Server 执行计划及Sql查询优化