我有一份死锁报告,告诉我有一个涉及到的冲突
waitresource="KEY: 9:72057632651542528 (543066506c7c)"
Run Code Online (Sandbox Code Playgroud)
我可以看到这个:
<keylock hobtid="72057632651542528" dbid="9" objectname="MyDatabase.MySchema.MyTable" indexname="MyPrimaryKeyIndex" id="locka8c6f4100" mode="X" associatedObjectId="72057632651542528">
Run Code Online (Sandbox Code Playgroud)
该范围内<resource-list>的元素。
我希望能够找到键的实际值(例如,id = 12345)。我需要使用什么 SQL 语句来获取该信息?
我有 2 个查询,当同时运行时会导致死锁。
查询 1 - 更新包含在索引 (index1) 中的列:
update table1 set column1 = value1 where id = @Id
Run Code Online (Sandbox Code Playgroud)
在 table1 上使用 X-Lock,然后在 index1 上尝试 X-Lock。
查询 2:
select columnx, columny, etc from table1 where {some condition}
Run Code Online (Sandbox Code Playgroud)
在 index1 上使用 S-Lock,然后在 table1 上尝试 S-Lock。
有没有办法在保持相同查询的同时防止死锁?例如,我可以在更新之前以某种方式在更新事务中的索引上使用 X-Lock 以确保表和索引访问的顺序相同 - 这应该防止死锁?
隔离级别为 Read Committed。为索引启用了行锁和页锁。同一个记录可能同时参与了两个查询 - 我无法从死锁图中判断出来,因为它没有显示参数。
当我运行以下查询时收到错误:
SELECT (
SELECT 1
FROM dbo.AccountEntry AE
WHERE AE.Account = P.Account
)
FROM dbo.Proposal P
WHERE P.id = @Id
Run Code Online (Sandbox Code Playgroud)
当通过 ADO.NET 运行时,它给出:
警告:致命错误 3624 发生在 2016 年 6 月 20 日凌晨 2:28。记下错误和时间,并联系您的系统管理员。当前命令发生严重错误。结果,如果有的话,应该被丢弃。
在 SSMS 中运行时,它会给出
位置:statutil.cpp:4128
表达式:iKey < m_statBlob.GetHeader()->GetKeyCount()
SPID:59 进程 ID:1732
消息 3624,级别 20,状态 1,第 1 行
系统断言检查失败。有关详细信息,请查看 SQL Server 错误日志。通常,断言失败是由软件错误或数据损坏引起的。要检查数据库损坏,请考虑运行 DBCC CHECKDB。如果您同意在安装过程中向 Microsoft 发送转储,则会向 Microsoft 发送一个小型转储。Microsoft 可能提供最新 Service Pack 中的更新或技术支持的 QFE。
Msg 0, Level 20, State 0, Line 0
当前命令发生严重错误。结果,如果有的话,应该被丢弃。
有趣的是,当将@Account 设置为 P.Account 时,此代码有效:
select 1 from …Run Code Online (Sandbox Code Playgroud) 在我的数据库上运行 sp_BlitzIndex 后,我发现了许多“主动索引”(https://www.brentozar.com/blitzindex/sp_blitzindex-aggressive-indexes/)。不仅如此,我还发现“积极索引”的数量正在缓慢增加。
我是一名涉足 DBA 方面的开发人员,我不知道如何从 sp_BlitzIndex 提供的有关主动索引的信息改进它们。
我可以调整单个查询的性能,但是我不知道如何找出索引变得激进时可能发生的查询,并且我假设发生锁定是因为服务器负载不足 - 这不会如果我调整单个查询,情况并非如此。
任何有关如何进一步调查的提示将不胜感激。