【发布时间】:2011-09-28 22:47:15
【问题描述】:
我的存储过程每次从 Web 应用程序调用时都会疯狂超时。
我启动了 Sql Profiler 并跟踪了超时的调用,最后发现了这些事情:
- 当从 MS SQL Management Studio 中执行语句时,使用相同的参数(实际上,我从 sql 配置文件跟踪复制了过程调用并运行它):平均在 5~6 秒内完成。
- 但是当从 Web 应用程序调用时,它需要超过 30 秒(在跟踪中),所以我的网页到那时实际上已经超时。
除了我的 Web 应用程序有自己的用户这一事实之外,每件事都是相同的(相同的数据库、连接、服务器等) 我还尝试使用 Web 应用程序的用户直接在工作室中运行查询,并且不会超过 6 秒。
我如何知道发生了什么?
我假设这与我们使用 BLL > DAL 层或表适配器这一事实无关,因为跟踪清楚地表明延迟存在于实际过程中。我能想到的就这些了。
编辑我在 this link 中发现 ADO.NET 将 ARITHABORT 设置为 true - 这在大多数情况下都很好,但有时会发生这种情况,建议的解决方法是将with recompile 选项添加到存储过程。就我而言,它不起作用,但我怀疑它与此非常相似。任何人都知道 ADO.NET 还能做什么或我在哪里可以找到规范?
【问题讨论】:
-
这可能与返回的数据量有关?
-
@Barry:不,因为我在管理工作室中运行相同的程序(也从跟踪复制 - 意味着相同的参数),它在 6 秒内运行。
-
@Jayantha:关键不是 sp 慢,而是 ado.net 和 sql 之间的一些东西。我看不出 sp 会有什么不同。
-
SP 是否返回大量数据,例如 image/text/varchar(max) 列?在客户端上消耗的数据量将是巨大的,这将花费大量时间。 SSMS 以更高效的方式切断这些结果集。
标签: asp.net sql-server-2008 stored-procedures