【问题标题】:ADO.NET Data reader vs direct execution in SSMSADO.NET 数据读取器与 SSMS 中的直接执行
【发布时间】:2015-07-21 07:59:23
【问题描述】:

我们的一位客户遇到了一个奇怪的问题。当客户端使用 ADO.NET SqlDataReader(从与 SqlServer 位于同一服务器上的桌面应用程序调用)运行存储过程时,SqlDataReader 需要大量时间来执行并最终超时。如果我从 SSMS 执行相同的存储过程(相同的参数),它几乎会立即运行(涉及的表不是很大)。

所涉及的表已编入索引,索引已在前一天晚上重建。

如果我运行“ALTER PROCEDURE procname..”,那么 SqlDatareader 也会立即开始运行,但只运行一段时间(大约 1-2 周),然后它又开始挂起。

问题仅发生在客户端服务器(即 Sql 2005)上,如果我备份他的数据库,我们的服务器上的工作正常,没有任何问题。

您能否建议我应该采取什么措施来防止这种情况发生?

在某个时间间隔重新编译过程是解决此问题的“正常”方法吗?

谢谢!

【问题讨论】:

  • 您是否尝试过制作个人资料?只是为了测试,尝试清理执行 DBCC DROPCLEANBUFFERS 和 DBCC FREEPROCCACHE 的缓存。让我知道结果。
  • 客户端只有一个快速版本的 Sql 20005,所以我无法访问探查器,并且在我的服务器上问题不是复制。我会尝试其他建议,看看发生了什么。谢谢里卡多!
  • 我明白了。因此,每次您更改/创建程序时,它都会快速运行,对吗?请在声明过程并进行测试时尝试重新编译选项:CREATE/ALTER (name) (parameters) WITH RECOMPILE AS ..... 您也可以使用 with exec 语句:EXECUTE procedure_name WITH RECOMPILE
  • 我采纳了你的建议,我修改了 sp。我会看看客户将来是否会抱怨。请将此作为答案。非常感谢里卡多!

标签: sql-server stored-procedures ado.net sqldatareader


【解决方案1】:

每次您更改/创建程序时,它都会快速运行,对吗?

您可以在声明过程并进行测试时使用重新编译选项:

CREATE/ALTER (name) (parameters) WITH RECOMPILE AS

你也可以使用 with exec 语句:

EXECUTE procedure_name WITH RECOMPILE

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2011-01-26
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 2012-08-19
    • 2010-10-10
    • 1970-01-01
    相关资源
    最近更新 更多