背景
SQL Server 数据库在批量数据同步时,出现严重的锁等待。从面板页面发现出现负载波峰,超过一百个会话处于蓝色的阻塞等待。

分析
从数据库的顶级活动会话中可以看到,出现阻塞等待的会话正在执行一条更新语句,阻塞等待类型为LCK_M_U
,会话因为更新锁被阻塞。

从 SQL 的详情页面发现 SQL 的平均执行时间为17毫秒,平均 CPU 时间为4毫秒,因此 SQL 执行时大部分时间处于等待状态。

从 SQL 的执行计划可以发现异常,条件[requestid]=@2
的访问路径为 Clustered index scan, 而不是 index seek,requestid
列上很可能没有索引,因此 SQL Server 选择对主键索引进行全扫描。
index scan: 需要扫描索引上的所有数据,相当于 Oracle 的
index full scan
.index seek:通过索引树精确命中满足过滤条件的记录,相当于 Oracle 的
index unique scan
或者index range scan
.

从表结构上可以确认表workflow
在requestid
上没有索引,索引导致对主键索引进行全扫描。

解决方法
推荐客户在表workflow
的requestid
列上创建索引,加快更新语句执行速度,降低或更新锁等待。
文章转载自云趣科技,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




