SQL Server死锁资源的查看

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-16浏览:1

SQL Server死锁资源的查看

        出现死锁,或者阻塞时,针对聚集索引的等待资源为key:dbid:hobtid(keyhashvalue),一般通过上下文,很容易知道对应的表,索引是什么,如果想知道对应表中哪条数据时,就比较麻烦了。

    如下图image.webp

   sql server提供了%%lockresl%%函数,其对应值就是keyhashvalue。为键值的哈希码,通过这个码我们就能知道对应的行记录,注意这个值是同时包括括号的。

    如:

image.webp

    以上面的死锁为例,可以获取对应的数据行

image.webp

    如果表没有聚集索引时,SQL SERVER存储数据将会以堆的方式存在,那么此时将显示为page的模式,如:

image.webp    

    可以看到,这些数据,都在一个页上。如果插入更多数据,将看到下面的结果:

image.webp

    上面的数据在分配上, 215和998间值是不连续的,这也证明了,sql server下需要有聚集才能保证数据的有序性,才能更好的避免死锁。

    如果想看到这些记录在那个数据页上,可以通过%%physloc%%与sys.fn_physlocformatter获取。

image.webp

    

附:可以通过下面的脚本,根据数据库名和死锁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),一般通过上下文,很容易知道对应的表,索引是什...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息