环境: 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操作一样暂时工作。
答案 0 :(得分:0)
可能是您的索引变得支离破碎。如果您要插入/删除/更新9个表,可能会发生这种情况。
示例te重建索引:
ALTER INDEX MyIndex ON MyTable REBUILD
一段时间后,插入/删除/更新将再次对索引进行分段。您可以安排重建以防止性能降低。例如,见:
http://technet.microsoft.com/en-us/library/ms180074(v=sql.100).aspx
答案 1 :(得分:0)
有什么症状?
以下是其中涉及的一些因素:您有一个复杂的查询, 涉及很多联接表(例如,8个或更多表 加入)。
请注意,将大量表联接在一起意味着有许多可能的联接顺序可供SQL考虑。
可能的解决方案之一是使用临时表分解为中间查询;另一个是自己确定最佳连接顺序,并使用提示FORCEORDER。