存储过程在特定用户上失败

我有一个存储过程不断失败,并在特定用户上显示错误消息超时已过期".

I have a Stored Procedure that is constantly failing with the error message "Timeout expired," on a specific user.

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

All other users are able to invoke the sp just fine, and even I am able to invoke the sp normally using the Query Analyzer--it finishes in just 10 seconds. However with the user in question, the logs show that the ASP always hangs for about 5 minutes and then aborts with a timeout.

我像这样从 ASP 页面调用EXEC SP_TV_GET_CLOSED_BANKS_BY_USERS '006111'"

I invoke from the ASP page like so "EXEC SP_TV_GET_CLOSED_BANKS_BY_USERS '006111'"

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

Anybody know how to diagnose the problem? I have already tried looking at deadlocks in the DB, but didn't find any.

谢谢,

推荐答案

一些想法...

阅读评论表明参数嗅探导致了问题.

Reading the comments suggests that parameter sniffing is causing the issue.

  • 对于其他用户,缓存的计划对于他们发送的参数来说已经足够了
  • 对于这个用户,缓存的计划可能是错误的

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

This could happen if this user has far more rows than other users, or has rows in another table (so a different table/index seek/scan would be better)

测试参数嗅探:

  • 在调用或定义中(临时)使用 RECOMPILE.对于复杂的查询,这可能会很慢
  • 超时后重建索引(或只是统计信息)并重试.这会使所有缓存的计划无效

修复:屏蔽参数

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

SELECT...WHERE column = @MaskedParam

只需谷歌参数嗅探"和参数屏蔽"

Just google "Parameter sniffing" and "Parameter masking"

相关文章