我的系统中有一个存储过程已经运行很长时间,因为它处理大量数据和导出过程。为了论证,程序将自行运行大约10秒。有时我会看到这个程序背靠背调用相同的参数。
致电1 - 开始12:00:10;持续时间30秒
致电2 - 开始12:00:15;持续时间10秒
看来第一个电话正在等待第二个电话完成才能完成。我已阻止进程报告运行,并且没有从分析器获得任何命中;另外,当我检查sys.dm_exec_requests时,我没有看到SPID被彼此阻止,并且最长的wait_type是async_network_io。
存储过程使用#temp和@temp表。我遇到了什么我应该检查或更改以控制这个?
答案 0 :(得分:1)
"最长的wait_type是async_network_io
" - 这通常是传输过多数据的症状,例如SELECT *
在大桌子或宽桌子上。
更新以回应您的评论:
"是的,这个程序有各种各样的功能。 1)返回20行 来自第1页.2)有内部逻辑将其转换为数据 倾销;返回所有客户数据的地方。
听起来您受到参数嗅探和不适当的缓存查询计划的影响。将您的过程拆分为两个单独的存储过程。这样每个人都可以拥有自己的缓存查询计划。
另请注意:表变量不会为它们创建统计信息,因此有时您可以通过转换为使用临时表来看到显着的性能改进。