重新创建过程后,SQL Server性能会发生变化

时间:2018-01-23 07:03:36

标签: sql-server performance stored-procedures

我们有一个主存储过程,它返回大约1000条记录,由用户权限进行更改。 最近,程序性能变得非常糟糕 - 但仅限于网络服务 - 超过一分钟! 但是当从ssms运行与相同参数的相同SP只用了3秒!! 当我尝试检查问题时,我添加了对日志表的写入,并立即将此更改从Web服务再次提高了3秒。 这对我来说是一个谜: 1.从Web服务和ssms运行之间的区别 2.添加日志记录后的更改

2 个答案:

答案 0 :(得分:1)

您的问题称为parameter sniffing。此过程有2个执行计划,一个是在您第一次从Web服务器启动时创建的,另一个是在您从SSMS引导它时创建的。这两个计划的参数不同。下次执行此proc时,将使用以下计划之一:从SSMS执行时,使用第二个计划,使用Web服务时使用第一个计划。传递给此proc的参数在从wb服务执行时是非典型的,并且在从SSMS执行时是典型的。

当您更改程序时,由于程序已更改,这两个计划无效,然后为SSMS和Web服务构建了新的执行计划,这次两个计划都是针对相同或类似的参数进行的。

如果您可以从计划缓存中提取旧计划,您会发现它们不同,并且嗅探的参数也不同,而现在计划相同且参数嗅探相同或类似。

在这里,您可以阅读有关参数嗅探的更多信息:Slow in the Application, Fast in SSMS? Understanding Performance Mysteries

答案 1 :(得分:-3)

请不要在TOP,记录集和WHERE / JOIN子句上使用函数。 当您从SSMS调用SP时,服务器会对其进行优化。但是,从前端打电话时,这是一个很大的问题。因此,如果可能,请删除功能。

如果你想查看我在说什么,请启动探查器,然后记录RPC启动/完成,sql statament事件。通话数量与记录集相同。因此,假设您在声明上使用FN时调用过程1000次,返回记录集。