我有一个存储过程经常失败,并在特定用户上显示错误消息"Timeout expired".
所有其他用户都能够很好地调用sp,甚至我可以使用查询分析器正常调用sp - 它只需10秒即可完成.但是对于有问题的用户,日志显示ASP总是挂起约5分钟,然后以超时中止.
我从ASP页面调用如此" EXEC SP_TV_GET_CLOSED_BANKS_BY_USERS '006111'
"
有谁知道如何诊断问题?我已经尝试过查看数据库中的死锁,但没有找到任何死锁.
谢谢,
一些想法......
阅读评论表明,参数嗅探导致了这个问题.
对于其他用户,缓存计划对于他们发送的参数足够好
对于此用户,缓存的计划可能是错误的
如果此用户具有比其他用户多得多的行,或者在另一个表中有行(因此不同的表/索引搜索/扫描会更好),则可能发生这种情况
要测试参数嗅探:
在呼叫或def中使用RECOMPILE(临时).对于复杂查询,这可能会很慢
超时后重建索引(或只是统计信息),然后重试.这会使所有缓存的计划无效
修复:屏蔽参数
DECLARE @MaskedParam varchar(10) SELECT @MaskedParam = @SignaureParam SELECT...WHERE column = @MaskedParam
只是google"参数嗅探"和"参数屏蔽"