我们很少有查询每 5 秒检查一次它们的状态并更新它们的状态。
下面是查询的样子(所有表列都在更新查询中)
update table1
set
Name='somename'
DetailMessage='Error'
LastUpdate=getdate()
where id=14
最近这个表遇到了阻塞问题,上面的更新查询是导致阻塞的。当我运行Sp_Blitzindex
时,它显示没有丢失索引,bur row lock contention of 284 minutes..
以下是我到目前为止所做的几个步骤..
1.确保外键被索引(它们也是主键)
2.为可以受益于新索引的 select 语句创建索引,从而减少该索引上的锁争用
3.我还将 Fillfactor 减少到 10,之前每页用于存储 93 行,现在它每页仅存储 7 行(仍然无法给自己一个 100% 合乎逻辑的解释,说明此更改将如何帮助......)
任何进一步的建议..如果您需要更多详细信息,请告诉我
下面是表的架构(更改了列名),表只有 350 行,查询以每 5 秒 20/30 次查询的频率更新此表...
create table dbo.table1
(
[ID] [int] NOT NULL,
[Name] [varchar](500) NULL,
[DetailMessage] [nvarchar](max) NOT NULL ,
[LastUpdate] [datetime] NOT NULL
)
PS:这是第三方查询,我们无法通过更改隔离级别等更改来修改源数据库...我只能添加索引
SQl 版本:SQl 2012
如果此第三方应用程序持有这些行锁的时间足以导致争用,并且
一种选择是在该数据库中启用 Read Committed Snapshot Isolation:
这应该会阻止这些
UPDATE
查询阻塞您的读取查询。请注意,这将影响读取查询的结果,因为它们将看到正在读取的数据的时间点快照,而不是被阻止等待更新。它还会增加 tempdb 的负载。有关实施 RCSI 的详细处理,请在此处查看 Kendra Little 的帖子:
在 SQL Server 中实现快照或读取提交的快照隔离:指南
我以前见过这个,或者非常相似的东西......只是不记得所有的细节。我认为解决方案是重建聚集索引,甚至将行选择到另一个表中,删除原始表,重新创建并重新插入复制表中的行。
可能/可能与幽灵清理记录有关,因为您不断更新表很多记录将被逻辑删除(又名幽灵),然后这些被幽灵记录清理任务删除(例如参见https://mssqlwiki .com/tag/what-is-ghost-cleanup-task/)我怀疑这是阻塞的根源。
知道阻塞链中是否涉及系统 spid (session_Id < 50) 会很有趣。