Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 运行存储过程的随机超时-删除重新创建修复_Sql_Database_Timeout_Database Administration - Fatal编程技术网

Sql 运行存储过程的随机超时-删除重新创建修复

Sql 运行存储过程的随机超时-删除重新创建修复,sql,database,timeout,database-administration,Sql,Database,Timeout,Database Administration,因此,我在一个10年历史的系统上使用了一个大型数据库(30Gig)SQL2005和一个.NET3.5Web前端。它有新的和旧的部分 我们遇到的问题越来越频繁 一个存储的进程(到目前为止我们已经有4个不同的进程)决定它将超时。调用从Web服务器进行,并达到30秒超时,并记录到我们的错误日志。该网站使用单一登录(我知道这是错误的,但由于遗留代码无法更改) 就在这之后,我运行完全相同的呼叫,它需要(以我的身份登录)1秒 这个问题一直存在于这个存储过程中,直到我们删除并重新创建它,并获得大量超时。每个s

因此,我在一个10年历史的系统上使用了一个大型数据库(30Gig)SQL2005和一个.NET3.5Web前端。它有新的和旧的部分

我们遇到的问题越来越频繁

一个存储的进程(到目前为止我们已经有4个不同的进程)决定它将超时。调用从Web服务器进行,并达到30秒超时,并记录到我们的错误日志。该网站使用单一登录(我知道这是错误的,但由于遗留代码无法更改)

就在这之后,我运行完全相同的呼叫,它需要(以我的身份登录)1秒

这个问题一直存在于这个存储过程中,直到我们删除并重新创建它,并获得大量超时。每个sp调用都有不同的参数。 与“获取我”中与当前用户相关的所有未签名的下班时间一样,当前用户作为参数传入

这个解决方案可行,但我真的不明白为什么

我们的发布周期是两周,在发布过程中,这个错误随时都会发生。它发生在发布一周后发布的第二天,最后一次是发布12天后

在每个版本的设计过程中,我们对所有存储的过程/触发器/函数/视图进行SQL多脚本编写,每次删除并重新创建自己

我所能想到的就是存储的proc执行计划已损坏/出错,删除并重新创建它可以清除此问题


我正在考虑使用重新编译选项调用sps,这是一个否??或者是一种可以接受的解决方法,我怀疑是存储过程直接导致了这种情况,除非它正在执行某种未被清除的锁定/事务逻辑。即使这样,我也看不出删除/重新创建会对这有什么影响。我可能会查看SP正在使用的数据,并尝试使用评测跟踪此数据的执行路径,看看是否可以提高性能。

这听起来很像我一次又一次看到的问题—存储过程计划已从计划缓存中刷新,下一次运行该过程时,只需将其刷新即可这样一来,传入的参数就产生了一个计划,该计划可能对这组参数很有用,但对其他组合的效果却很差

如果您有“可选”参数,其中可以传递NULL或值,并且您在
where
子句中使用
来处理此问题,那么这通常会导致此类事情

使用重新编译可能会导致每次编译计划时占用大量CPU—如果大量调用存储过程,则很容易对服务器的总体性能产生影响—此操作系统是否会被错误计划的影响所抵消是另一回事

一般来说,最好尝试重写查询-如果您使用
s来处理不同的参数集,那么动态SQL(采用正确的方法,使用带有参数的sp_executesql)会有很大帮助


另外,关于存储过程在运行时运行良好的问题-我也看到了这一点-我希望这是因为生成了不同的计划-我一直怀疑,通过SSMS运行时启用的
set
选项集与(在我的实例中)启用的
选项集稍有不同.Net和计划在此实例中分别缓存。如果有人能证实这可能发生,我们将不胜感激

这很可能是因为为特定进程存储了错误的执行计划

问题(简化)是SQL server试图根据传递的参数优化执行计划的使用。在某些情况下,这可能导致可怕的性能

这里有一些阅读来进一步解释它



好的一面是,通过将过程中传递的参数复制到局部变量来修复非常简单。

“我看不出删除/重新创建会对这有什么影响。”。如果性能问题是锁定/事务逻辑,则不会产生任何影响,但如果问题与执行计划相关,则会产生巨大影响。重新创建SP(ALTER或DROP/CREATE)将刷新当前执行计划,强制在下次调用时生成新的执行计划。这会有很大的不同。今天有同样的问题,非常棘手。执行alter语句而不进行更改也对我有所帮助。