Sql 存储过程计划优化

Sql 存储过程计划优化,sql,sql-server,optimization,Sql,Sql Server,Optimization,我在SQLServer2008R2中有一个存储过程,它根据传入的几个参数值查询单个非常大且非常繁忙的表。我无法控制模式 大多数情况下,存储过程的性能都很好,但有时它似乎编译了一个非常糟糕的执行计划(我猜是一个表扫描,这可能是这个表的问题) 优化存储过程以避免这种情况的最佳方法是什么?我目前正在尝试使用一些合理的参数值对进行优化 然而,我认为我最好使用USE PLAN&强制执行一个我知道效果很好的执行计划(没有JOINs,表上只有3个索引,表大小相当一致(很大!),所以我认为该计划实际上不需要更改

我在SQLServer2008R2中有一个存储过程,它根据传入的几个参数值查询单个非常大且非常繁忙的表。我无法控制模式

大多数情况下,存储过程的性能都很好,但有时它似乎编译了一个非常糟糕的执行计划(我猜是一个表扫描,这可能是这个表的问题)

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

然而,我认为我最好使用
USE PLAN
&强制执行一个我知道效果很好的执行计划(没有
JOIN
s,表上只有3个索引,表大小相当一致(很大!),所以我认为该计划实际上不需要更改)


有人有过这种经历吗?什么最有效?

格兰特·弗里奇是我在当地通行证分会的朋友

任何人,您确定没有进行参数嗅探吗

这通常发生在数据倾斜的情况下

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

但关键是以图形的形式找到/查看好的和坏的计划

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

祝你好运


J

我想我已经破解了它-问题似乎是导致底层表中没有记录的参数

我添加了一个日期谓词——尽管查询实际上并不需要,因为它使用整数升序键返回X个最新记录

这大大减少了在没有与参数值匹配的记录时搜索的记录数

希望这有意义


感谢您的评论-非常高兴能更详细地了解这些内容。

我通常首先检查参数嗅探。我花了几个小时重构查询,只是为了发现使用局部变量而不是参数变量可以从一开始就解决这个问题。我不知道它是否会帮助你,所以这不是一个答案,但这里有一个不错的链接:你是否尝试过在SSMS中查看执行计划?它可能会让您看到哪个表导致性能下降。您是否检查过以确保统计数据是最新的?如果有大量的更新/插入/删除ActivityTool,这可能是一个问题-感谢您提供的pdf,这是一些有趣的内容。