存储过程对特定用户失败

时间:2008-11-07 16:58:01

标签: sql sql-server asp-classic timeout sql-server-2000

我的存储过程一直失败,并且特定用户的错误消息“Timeout expired”。

所有其他用户都能够很好地调用sp,甚至我可以使用查询分析器正常调用sp - 它只需10秒即可完成。但是对于有问题的用户,日志显示ASP总是挂起大约5分钟,然后超时中止。

我从ASP页面调用“EXEC SP_TV_GET_CLOSED_BANKS_BY_USERS '006111'

有人知道如何诊断问题吗?我已经尝试过查看数据库中的死锁,但没有找到任何死锁。

谢谢,

5 个答案:

答案 0 :(得分:5)

一些想法......

阅读评论表明参数嗅探导致了这个问题。

  • 对于其他用户,缓存计划足以支持他们发送的参数
  • 对于此用户,缓存的计划可能不正确

如果此用户的行数远多于其他用户,或者在另一个表中有行(因此不同的表/索引搜索/扫描会更好),则可能会发生这种情况。

测试参数嗅探:

  • 在通话或def中使用RECOMPILE(暂时)。复杂查询可能会很慢
  • 在超时后重建索引(或仅统计信息),然后重试。这会使所有缓存的计划无效

修复: 掩盖参数

DECLARE @MaskedParam varchar(10)
SELECT @MaskedParam = @SignaureParam

SELECT...WHERE column = @MaskedParam

只需google“参数嗅探”和“参数屏蔽”

答案 1 :(得分:0)

我想回答你的问题,我们可能需要更多的信息。

例如,您使用Active Directory对用户进行身份验证吗?您是否使用SQL分析器进行调查?听起来这可能是一个身份验证问题,其中SQL Server在验证此特定用户时遇到问题。

答案 2 :(得分:0)

听起来就像一个死锁问题..

还要确保此用户在SQL Server中具有执行权限和读取权限

但是,如果当时信息被写为试图被读取,那么你将死锁,因为交易尚未提交。

杰夫做了一篇关于他和stackoverflow的经历的精彩帖子。 http://www.codinghorror.com/blog/archives/001166.html

答案 3 :(得分:0)

要检查的事情:

  1. 这是否只发生在特定用户的计算机上?他可以试试另一个吗? 机? - 这可能是客户端配置问题。
  2. 您是否可以捕获此特定用户运行的实际字符串并从ASP页面运行它?可能是用户以生成循环或大量数据的方式执行SP。
  3. 最后,如果您使用的是组织内部应用程序,则可能是您的特定用户的权限与其他用户的权限不同。您可以在Active Directory级别比较它们。
  4. 现在,我可以推荐一款能够解决您问题的商业软件。它记录端到端事务,并分析特定故障。但我不想在这个论坛做广告。如果您愿意,请给我留言,我会解释更多。

答案 4 :(得分:0)

好吧,我建议您使用SQL Server Profiler并打开一个新会话。从ASP页面调用存储过程,看看发生了什么。虽然这可能无法解决您的问题,但它肯定会为您提供一个自己进行“调查”的起点。