我在SQL Server 2008 R2中有一个存储过程,它会查询一个非常大的&非常繁忙的表基于传入的一些参数值。我无法控制模式。
大多数情况下,存储过程执行得非常好,但有时它似乎编译了一个非常糟糕的执行计划(我的猜测是一个表扫描 - 这对于这个表来说是疯了)。
什么是优化存储过程以避免这种情况的最佳方法?我正在尝试OPTIMIZE FOR
&使用一些合理的参数值
然而,我认为USE PLAN
&只强制一个我知道运行良好的执行计划(没有JOIN
s,表上只有3个索引,表大小非常一致(BIG!)所以我认为计划不应该真正需要改变)。
任何人都有过这种事情的经历吗?什么效果最好?
答案 0 :(得分:1)
Grant Fritchey是我当地PASS分会的朋友。
任何人,您确定没有参数嗅探吗?
通常会出现偏斜的数据。
如果是这样,有七种不同的方法来对抗它。查看Grant的幻灯片。
http://www.scarydba.com/wp-content/uploads/2011/01/LuckyConnections.pdf
但关键是要以图形格式查找/查看好的和坏的计划。
为什么一个比下一个好。一旦你知道发生了什么,就选择一种解决方法。
祝你好运Ĵ
答案 1 :(得分:0)
我认为我破解了它 - 问题似乎是导致基础表中没有记录的参数。
我添加了一个日期谓词 - 即使查询并不真正需要,因为它使用整数升序键来返回X最近的记录。
当参数值没有匹配记录时,这大大减少了搜索的记录数。
希望这是有道理的!
感谢您的评论 - 非常了解这些内容。