存储过程对特定用户失败

bas*_*gio 3 sql sql-server timeout sql-server-2000 asp-classic

我有一个存储过程经常失败,并在特定用户上显示错误消息"Timeout expired".

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

我从ASP页面调用如此" EXEC SP_TV_GET_CLOSED_BANKS_BY_USERS '006111'"

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

谢谢,

gbn*_*gbn 5

一些想法......

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

  • 对于其他用户,缓存计划对于他们发送的参数足够好
  • 对于此用户,缓存的计划可能是错误的

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

要测试参数嗅探:

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

修复:屏蔽参数

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

SELECT...WHERE column = @MaskedParam
Run Code Online (Sandbox Code Playgroud)

只是google"参数嗅探"和"参数屏蔽"