2

环境:Windows 2008 R2、SQL Server 2008 SP1

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

分配了错误的内存授予。

即使有大量可用的 ram,也可以在 tempdb 而不是 ram 中进行排序。

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

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

问题:以前有人见过这个问题吗?

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

优化器到底在做什么?

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

我已经尝试过的事情: UPDATE STATS ON {ALL 9 Tables} WITH FULLSCAN

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

4

2 回答 2

0

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

示例 te 重建索引:

ALTER INDEX MyIndex ON MyTable REBUILD

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

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

于 2013-11-08T22:19:34.067 回答
0

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

有什么症状?

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

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

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

于 2019-11-04T14:53:19.470 回答