SQL Server死锁资源的查看
出现死锁,或者阻塞时,针对聚集索引的等待资源为key:dbid:hobtid(keyhashvalue),一般通过上下文,很容易知道对应的表,索引是什么,如果想知道对应表中哪条数据时,就比较麻烦了。
如下图
sql server提供了%%lockresl%%函数,其对应值就是keyhashvalue。为键值的哈希码,通过这个码我们就能知道对应的行记录,注意这个值是同时包括括号的。
如:
以上面的死锁为例,可以获取对应的数据行
如果表没有聚集索引时,SQL SERVER存储数据将会以堆的方式存在,那么此时将显示为page的模式,如:
可以看到,这些数据,都在一个页上。如果插入更多数据,将看到下面的结果:
上面的数据在分配上, 215和998间值是不连续的,这也证明了,sql server下需要有聚集才能保证数据的有序性,才能更好的避免死锁。
如果想看到这些记录在那个数据页上,可以通过%%physloc%%与sys.fn_physlocformatter获取。
附:可以通过下面的脚本,根据数据库名和死锁KEY资源获取数据
declare @databaseName varchar(100) = 'test' --数据库名declare @keyValue varchar(100) = 'KEY: 8:72057845012037632 (37f01f22e733)' --资源declare @lockres varchar(100)declare @hobbitID bigint select @hobbitID = convert(bigint, RTRIM(SUBSTRING(@keyValue, CHARINDEX(':', @keyValue, CHARINDEX(':', @keyValue) + 1) + 1, CHARINDEX('(', @keyValue) - CHARINDEX(':', @keyValue, CHARINDEX(':', @keyValue) + 1) - 1))) select @lockRes = RTRIM(SUBSTRING(@keyValue, CHARINDEX('(', @keyValue) + 1, CHARINDEX(')', @keyValue) - CHARINDEX('(', @keyValue) - 1)) declare @objectName sysnamedeclare @ObjectLookupSQL as nvarchar(max) = 'SELECT @objectName = o.nameFROM ' + quotename(@databaseName) + '.sys.partitions pJOIN ' + quotename(@databaseName) + '.sys.indexes i ON p.index_id = i.index_id AND p.[object_id] = i.[object_id]join ' + quotename(@databaseName)+ '.sys.objects o on o.object_id = i.object_idWHERE hobt_id = ' + convert(nvarchar(50), @hobbitID) + '' exec sp_executesql @ObjectLookupSQL ,N'@objectName sysname OUTPUT' ,@objectName = @objectName output declare @finalResult nvarchar(max) = N'select %%lockres%% hashvalue,'''+@objectName+''' tabname,SYS.fn_PhysLocFormatter(%%PHYSLOC%%) page,*from ' + quotename(@databaseName) + '.dbo.' + @objectName + 'where %%lockres%% = ''(' + @lockRes + ')''' exec sp_executesql @finalResult
SQL Server死锁资源的查看
出现死锁,或者阻塞时,针对聚集索引的等待资源为key:dbid:hobtid(keyhashvalue),一般通过上下文,很容易知道对应的表,索引是什...
点击下载文档
本文2024-09-16 18:41:41发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-23804.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章