SQL Server 2005阻止问题(ASYNC_NETWORK_IO)

时间:2010-03-12 18:46:36

标签: sql-server-2005 performance

我负责在IIS和SQL Server 2005上运行的第三方应用程序(无法访问源)(500个并发用户,1TB数据,8个IIS服务器)。我们最近开始看到对数据库的严重阻塞(在生产中运行此应用程序几个月后没有问题)。这种情况在白天以大约每30分钟的随机间隔发生,每次影响20到100次。所有会话最终都会使应用程序超时并且会话中止。

问题消失然后逐渐重新出现。负责阻止的SPID始终具有以下功能:

  • 等待类型= ASYNC_NETWORK_IO
  • 正在运行的SQL是“(@claimid varchar(15))SELECT claimid,enrollid, 状态,orgclaimid,resubclaimid, primaryclaimid FROM声称WHERE primaryclaimid = @claimid AND primaryclaimid<> ClaimID的)”。这是 应该是相对无害的SQL 只返回一两条记录,而不是一条 大数据集。
  • 没有其他SQL语句 涉及阻塞,只有这一点 SQL语句。
  • 这是参数化的SQL 缓存执行计划 sys.dm_exec_cached_plans。
  • 此SPID在声明表上有一个对象级别的S锁,因此声明表的所有UPDATE / INSERT也会被阻止。
  • 主机ID有所不同。不同的Web服务器负责阻塞会话。例如,有时我们追溯到Web服务器1,有时是Web服务器2.

当我们追溯到阻塞中涉及的Web服务器时,我们会看到以下内容:

  • 总有某种 应用程序相关的错误 事件登录Web服务器,已链接 到主机ID和主机进程ID 来自SQL Session。
  • 错误消息因人而异 SystemOutofMemory。 (这些 错误消息似乎与之类似 我们看到的错误消息 没有这种戏剧性的过去 后果。我们认为正在发生 之前,但没有导致阻塞。 为什么现在?)
  • 网络没有已知问题 Web服务器上的适配器或 SQL服务器。

(无论如何,违规查询返回的记录集很小。)

事情被排除在外:

  • 索引经常进行碎片整理。
  • 定期更新统计数据。
  • 增加统计信息的样本量 在claim.primaryclaimid。
  • 强制重新编译缓存 执行计划。
  • 使用创建复合索引 primaryclaimid,claimid。
  • 没有网络问题。
  • 网络服务器上没有已知问题。
  • 没有更改应用程序软件 网络服务器。

我们假设事件链是这样的:

  1. Web服务器进程提交SQL 上方。
  2. SQL服务器在执行期间执行SQL 它获得了锁定 索赔表。
  3. Web服务器进程出错并且 模具
  4. SQL服务器会话挂起等待 用于Web服务器进程读取 数据集。
  5. 需要获取的SQL Server会话 X锁定声明表的某些部分 (任何处理索赔的人)都是 被索赔锁定阻止 表,并保持阻止,直到他们 所有这些都打压了申请时间。
  6. 欢迎任何在等待供应商帮助时进行故障排除的建议。

    是否有办法强制SQL Server仅针对此特定SQL语句锁定行/页级别? 有没有办法在ASYNC_NETWORK_IO等待上设置阈值?

2 个答案:

答案 0 :(得分:7)

ASYNC_NETWORK_IO是由客户端无法快速接收数据并填充网络缓冲区(简单地放入)引起的。没有神奇的SQL Server设置来修复它。

  • 重启客户端(即使是网络服务器)
  • 确保NIC设置正确(固件,全双工等)
  • 确保物理线缆正常(任何丢包等?)

是SQL Server问题,因此......

  

ASYNC_NETWORK_IO在网络上发生   在任务被阻止后写入   网络。验证客户端是否   处理来自服务器的数据。

答案 1 :(得分:1)

我遇到了同样的问题,当我在客户端禁用卡巴斯基反病毒软件时,它解决了。