我负责在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。
- 没有网络问题。
- 网络服务器上没有已知问题。
- 没有更改应用程序软件
网络服务器。
我们假设事件链是这样的:
- Web服务器进程提交SQL
上方。
- SQL服务器在执行期间执行SQL
它获得了锁定
索赔表。
- Web服务器进程出错并且
模具
- SQL服务器会话挂起等待
用于Web服务器进程读取
数据集。
- 需要获取的SQL Server会话
X锁定声明表的某些部分
(任何处理索赔的人)都是
被索赔锁定阻止
表,并保持阻止,直到他们
所有这些都打压了申请时间。
醇>
欢迎任何在等待供应商帮助时进行故障排除的建议。
是否有办法强制SQL Server仅针对此特定SQL语句锁定行/页级别?
有没有办法在ASYNC_NETWORK_IO等待上设置阈值?