小编Dal*_*e K的帖子

如何将 SQL Server 死锁报告中的键转换为值?

我有一份死锁报告,告诉我有一个涉及到的冲突

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 语句来获取该信息?

sql-server deadlock primary-key sql-server-2012

17
推荐指数
4
解决办法
1万
查看次数

SQL Server 索引更新死锁

我有 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。为索引启用了行锁和页锁。同一个记录可能同时参与了两个查询 - 我无法从死锁图中判断出来,因为它没有显示参数。

死锁图

sql-server deadlock locking

16
推荐指数
1
解决办法
9871
查看次数

致命错误 3624:iKey &lt; m_statBlob.GetHeader()-&gt;GetKeyCount()

当我运行以下查询时收到错误:

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)

sql-server sql-server-2012

4
推荐指数
1
解决办法
1834
查看次数

如何调查“积极索引”

在我的数据库上运行 sp_BlitzIndex 后,我发现了许多“主动索引”(https://www.brentozar.com/blitzindex/sp_blitzindex-aggressive-indexes/)。不仅如此,我还发现“积极索引”的数量正在缓慢增加。

我是一名涉足 DBA 方面的开发人员,我不知道如何从 sp_BlitzIndex 提供的有关主动索引的信息改进它们。

我可以调整单个查询的性能,但是我不知道如何找出索引变得激进时可能发生的查询,并且我假设发生锁定是因为服务器负载不足 - 这不会如果我调整单个查询,情况并非如此。

任何有关如何进一步调查的提示将不胜感激。

performance sql-server sp-blitzindex performance-tuning

2
推荐指数
1
解决办法
853
查看次数