Sql server SQL Server过程执行计划出现奇怪的问题

Sql server SQL Server过程执行计划出现奇怪的问题,sql-server,sql-server-2005,stored-procedures,sql-execution-plan,Sql Server,Sql Server 2005,Stored Procedures,Sql Execution Plan,我想知道你们是否能帮我弄清我最近在SQL Server上遇到的一个奇怪问题的真相 我有一个存储过程(让我们调用SPold),它相当大,需要大量计算(不可能在应用程序中执行此操作,因为大约6000个用户的信息需要在一个er中返回(我根据姓氏将其减少到1000))。存储过程通常在几秒钟内执行,并且每隔几分钟调用一次 今天早上,存储过程的执行时间突然增加了4-10倍,导致了多次超时。我发现,通过使用新名称(SPnew)复制过程并执行,我可以再次获得快速执行时间。这向我表明,执行计划是原始文件SPold

我想知道你们是否能帮我弄清我最近在SQL Server上遇到的一个奇怪问题的真相

我有一个存储过程(让我们调用
SPold
),它相当大,需要大量计算(不可能在应用程序中执行此操作,因为大约6000个用户的信息需要在一个er中返回(我根据姓氏将其减少到1000))。存储过程通常在几秒钟内执行,并且每隔几分钟调用一次

今天早上,存储过程的执行时间突然增加了4-10倍,导致了多次超时。我发现,通过使用新名称(
SPnew
)复制过程并执行,我可以再次获得快速执行时间。这向我表明,执行计划是原始文件SPold的问题,因此我决定重新编译执行它。这将更快地返回结果(虽然没有
SPnew
那么快),但随后用户对
SPold
的调用再次变慢。好像新计划没有得到遵守

我所做的是修复这个问题,将
Exec SPnew
放入
SPold
,现在对
SPold
的调用再次快速返回


有人知道这里发生了什么吗?一夜之间唯一更新的是统计数据,尽管我认为这应该会影响
SPold
SPnew

听起来,由于参数嗅探,您正在经历一个不正确的缓存查询计划

您可以发布存储过程吗

在SQL Server 2005中,可以使用参数首选值的查询提示来解决与参数嗅探相关的一些问题:

OPTIMIZE FOR指示查询优化器对本地查询使用特定值 编译和优化查询时的变量。使用该值 仅在查询优化期间,而不是在查询执行期间。 优化可以抵消 优化器或可在创建计划指南时使用。更多 有关详细信息,请参阅和

尽管SQL Server 2005不支持针对未知对象进行优化(在SQL Server 2008中引入),但 将消除给定参数的参数嗅探:

OPTION (OPTIMIZE FOR (@myParam UNKNOWN))

在SQL Server 2005中,您可以通过将参数复制到局部变量中,然后在查询中使用局部变量来实现相同的效果。

我在SQL Server 2005中也遇到了两个“奇怪”的情况,这可能与您的问题有关

在第一种情况下,当作为dbo运行时,我的过程执行得相当快,而当从应用程序运行时,在另一个用户帐户下执行得很慢

在第二种情况下,该过程的查询计划针对第一次调用该过程时使用的参数值进行了优化,随后该计划也被用于其他参数值,从而导致执行缓慢


对于第二种情况,解决方案是将参数值复制到过程中的局部变量中,然后在查询中使用变量而不是参数。

不幸的是,对于comp。我发布实际查询的策略。我可以改变一下,但需要一段时间!索引和统计信息肯定会影响SP(旧SP和新SP),因为它们位于同一个DB中?我将研究参数嗅探,虽然…这可能会有帮助好吧-我将其标记为完整,尽管Mitch也正确,因为它是参数嗅探。Treaschf给了我一个解决方案。。。我也在阅读上面的链接,这是信息最丰富的。