2013-12-18 240 views
0

我在SQL Server 2008 R2中有一个存储过程,它根据传入的一些参数值来查询非常大的单个表&。我无法控制模式。存储过程计划优化

大多数情况下,存储过程执行得非常好,但偶尔它似乎会编译一个真正不好的执行计划(我的猜测是一个表扫描 - 这将是这张表的坚果)。

什么是优化存储过程以避免这种情况的最佳方法?我目前正试图OPTIMIZE FOR &使用一些合理的参数值

不过,我想我可能是USE PLAN &更好正义的力量,我知道作品以及执行计划(没有JOIN S,只是3项指标上表格和表格大小非常一致(BIG!),所以我认为这个计划不应该真的需要改变)。

任何人都有过这种事情的经验?什么效果最好?

+0

我通常首先检查参数嗅探。我花了几个小时重构查询,只是发现使用局部变量而不是参数变量可能已经修复了它。我不知道它是否会帮助你,所以这不是一个答案,但这是一个体面的链接:http://blogs.technet.com/b/mdegre/archive/2012/03/19/what-is- parameter-sniffing.aspx – Malk

+0

你有没有试过在SSMS中查看执行计划?它可能会给你一个视觉上哪个表导致性能受到影响。 –

+0

您是否检查过以确保您的统计信息是最新的?这可能是一个问题,如果有很多的UPDATE/INSERT/DELETE活动 – JohnFx

回答

1

Grant Fritchey是我们当地PASS章节的朋友。

任何人,你确定你没有参数嗅探继续吗?

它通常发生在倾斜数据。

如果是这样,有七种不同的方式来对付它。看看格兰特的幻灯片。

http://www.scarydba.com/wp-content/uploads/2011/01/LuckyConnections.pdf

但关键是要找到/看无论是在图形格式好的和坏的计划。

为什么比下一个更好。一旦你知道发生了什么,选择一种方法来解决它。

好运

Ĵ

+0

很酷 - 感谢pdf,需要研究一些有趣的部分。 – SinisterPenguin

0

我想我破解了 - 问题似乎是导致不从基础表中的记录参数。

我添加了一个日期谓词 - 即使查询并不真的需要一个,因为它使用整数升序键来返回X最近的记录。

当参数值没有匹配记录时,这大大减少了搜索记录的数量。

希望这是有道理的!

感谢您的评论 - 它非常了解这些事情的更多细节。