环境: Windows 2008 R2、SQL Server 2008 SP1
问题:9个表的表内连接查询在实际执行计划中得到“提前终止语句的原因: TimeOut”。
分配了错误的内存授权。
排序是在tempdb而不是ram中完成的,即使有大量的ram可用。
在tempdb中进行排序时,性能较慢。
考虑一下:如果我从9个表中删除、创建和删除其中一个索引,查询将再次得到完全优化,排序将在ram中以完全性能完成。然而,只要我稍微修改一下查询,它就会再次失去完整的优化。
问:以前有没有人见过这个问题?
有没有办法获得更多关于为什么会发生“超时”的信息?
优化器到底在做什么?
如果没有解决查询优化器问题的方法,我会考虑为tempdb创建一个ramdisk。将ramdisk用于tempdb有什么风险?
我已经尝试过的事情:使用FULLSCAN更新{所有9个表}上的STATS
索引重建的工作原理暂时类似于我上面的DROP CREATE DROP操作。
发布于 2013-11-09 06:19:34
可能是您的索引变得碎片化了。如果您经常插入/删除/更新这9个表,则可能会发生这种情况。
示例te重建索引:
ALTER INDEX MyIndex ON MyTable REBUILD一段时间后,插入/删除/更新将再次对索引进行碎片处理。您可以安排重建,以防止性能下降。例如,请参阅:
http://technet.microsoft.com/en-us/library/ms180074(v=sql.100).aspx
发布于 2019-11-04 22:53:19
有什么症状?
以下是一些涉及的因素:您有一个复杂的查询,其中涉及大量的连接表(例如,8个或更多的表被连接)。
请注意,将许多表联接在一起意味着SQL需要考虑许多可能的联接顺序。
一种可能的解决方案是使用临时表分解成中间查询;另一种方法是自己确定最佳连接顺序并使用hint FORCEORDER。
https://stackoverflow.com/questions/19869414
复制相似问题