0

我的系统中有一个存储过程已经运行了很长时间,这在某种程度上是意料之中的,因为它处理大量数据和一个导出过程。出于争论的目的,该过程将自行运行大约 10 秒。有时我会看到这个过程使用相同的参数被背靠背调用。

呼叫 1 - 12:00:10 开始;持续时间 30 秒

呼叫 2 - 12:00:15 开始;持续时间 10 秒

似乎第一个调用正在等待第二个调用完成,然后才能完成。我阻止了进程报告的运行,并且没有从探查器那里得到任何点击;此外,当我检查 sys.dm_exec_requests 时,我没有看到 SPID 被彼此阻塞,最长的 wait_type 是 async_network_io。

存储过程同时使用#temp 和@temp 表。我被卡住了,我还应该检查或更改什么来控制它?

4

1 回答 1

1

“最长的等待类型是async_network_io” - 这通常是传输过多数据的症状,例如SELECT *在大表或宽表上。

更新以回应您的评论:

“是的,此过程具有排序的双重功能。1) 从第 1 页返回 20 行。2) 有内部逻辑将其转换为排序的数据转储;返回所有客户端数据。

听起来您正受到参数嗅探和不适当的缓存查询计划的影响。将您的过程拆分为 2 个单独的存储过程。这样每个人都可以有自己的缓存查询计划。

另请注意:表变量不会为它们创建统计信息,因此有时您可以通过转换为使用临时表来看到显着的性能改进。

于 2013-06-11T23:57:13.610 回答