需要定期删除并重新创建存储过程吗?

时间:2016-02-24 15:38:34

标签: sql sql-server stored-procedures linked-server sql-view

这是我的问题。我使用的是SQL Server 2014.我有一个ASP.Net Web应用程序,它接受来自用户的字符串。该字符串被传递给存储过程(SP),该存储过程查询查询链接服务器的视图。我的数据访问层将数据表返回给我的业务对象。如果有IS数据 - 输入的字符串被认为是有效的(它在链接服务器上有匹配)。如果没有数据,则输入的字符串被视为无效(链接服务器上没有匹配项)。

简单地说,这是信息的路径:

WebApp - 存储过程 - 查看 - 链接服务器 - 包含数据的表

显然,一旦查询执行(并且数据从表传递到最终到web-app),这条路径就会颠倒过来。

这是奇怪的地方。自SP创建以来的最近13个月中已经两次(今天是第二次),当输入VALID字符串时,没有数据返回到Web应用程序。需要说明的是,这个SP总是有效(除了这两次)。但是,一旦它失败了,它就不会工作,直到它被丢弃并重新创建。

所以,这是什么工作:

  • 直接查询链接服务器,并将字符串添加到 WHERE子句。
  • 直接查询视图,并将字符串添加到WHERE 子句。

以下是DOESN&T的工作原理:

  • 将字符串输入网络应用程序。
  • 直接查询SP,并将字符串作为参数传递。

真的,非常奇怪的部分:

发生这种情况的时间,删除并重新创建存储过程解决了问题。 SP如何工作几个月,然后停止工作?那么修复方法是如何删除并重新创建SP?

首先,为什么会发生这种情况?有许多其他Web应用程序调用SP,调用视图,调用从未失败的SAME链接服务器。但是一年两次ONE SP失败没有明显的理由 - 删除并重新创建它解决了这个问题?

请帮助 - 这真令人困惑......如果您需要更多信息,请告诉我。

修改

回应alroc的评论:

  • 创建存储过程的脚本没有任何内容 安全。任何可以访问数据库的用户都可以访问SP。
  • 我是这里唯一的DBA,所以没有其他人"应该"改变任何 数据库的安全性或权限。但是,如果他们这样做的话 那个,我会期待其他地方的这些问题,因为网络应用程序 使用相同的SQL登录(相同的连接字符串) 每一个其他过程 - 其中有数百个。

第二次编辑

回应beercohol的评论:

  • 查询没有超时 - 它几乎不会立即返回任何结果。 超时设置为30秒,这不会接近 接近那个门槛。
  • 我运行了DBCC CheckDB,没有发现任何错误。
  • 下次发生这种情况时,我会尝试重新编译SP,但为什么执行计划会对数百或数千的ONE SP产生不良影响?

2 个答案:

答案 0 :(得分:1)

我没有经历过您所描述的确切场景,但我已经处理过一个实例,即尽管对基础数据进行了无关紧要的更改,但存储过程偶尔会开始非常缓慢地运行。问题结果证明是SQL Server的一个名为“参数嗅探”的功能。此功能使用编译过程时传递的参数来确定为将来调用缓存的执行计划。

如果向过程传递不同的参数会严重影响生成的执行计划,则参数嗅探可能会产生不良影响。你会经常通过“搜索”程序找到它,这些程序采用大量参数,其中只有少数参数用于任何给定的调用。

我的解决方案是通过为每个参数声明一个局部变量并复制值来禁用参数嗅探功能。然后使用局部变量代替剩余程序的参数。这足以阻止优化器在确定执行计划时使用原始参数值。

答案 1 :(得分:0)

此问题已解决。添加WITH RECOMPILE已永久修复此问题。我与其他软件开发人员交谈,他告诉我SQL中存在一个错误,导致缓存的性能计划随着时间的推移开始表现越来越差。它仍然没有解释为什么这只发生在某些存储过程而不是全部 - 但是,无论如何,强制它们在执行时重新编译!

然而,对于高度需求的SP来说,这不是一个可行的选择,因为你不想重新编译它数万次 - 但为了我的目的,它的工作正常。