SQLServer 阻塞的等待类型解析

死锁和阻塞是数据库中最常见的问题,一般遇到的时候如何查找阻塞的源头:

首先查看 sys.sysprocesses 中blocked 情况,然后查看对应的lastwaitype and waitresource .

对于waitresource 主要有几种情况:

举个常用的例子:

(一)

Page:20:11:1635088    

20:database Id

11:File Id

1635088    :Page Id 

1 .首先找到数据库名字

select object_name(20) 

2.找到数据库的文件名字

use DBName

select * from sys.database_files
where file_id =11

3. 通过page id 找到具体的对象:

打开DBCC 3604 开关,然后运行DBCC Page (databaseName,fileId,pageId,dumStyle) 

DBCC TRACEON(3604)

DBCC Page (DBNAME,11,1635088 ,2

我们会看到如下的数据:

ge @0x000000A93DC34000

m_pageId = (11:1635088) m_headerVersion = 1 m_type = 1
m_typeFlagBits = 0x0 m_level = 0 m_flagBits = 0xa200
m_objId (AllocUnitId.idObj) = 13777 m_indexId (AllocUnitId.idInd) = 256
Metadata: AllocUnitId = 72057594940817408
Metadata: PartitionId = 72057594859618304 Metadata: IndexId = 1
Metadata: ObjectId = 727829805 m_prevPage = (12:691363) m_nextPage = (11:1635089)
pminlen = 22 m_slotCnt = 99 m_freeCnt = 4
m_freeData = 7990 m_reservedCnt = 0 m_lsn = (2091562:262743:114)
m_xactReserved = 0 m_xdesId = (0:0) m_ghostRecCnt = 0
m_tornBits = 816587892 DB Frag ID = 1

...

SELECT 
    sc.name as schema_name, 
    so.name as object_name, 
    si.name as index_name
FROM sys.objects as so 
JOIN sys.indexes as si on 
    so.object_id=si.object_id
JOIN sys.schemas AS sc on 
    so.schema_id=sc.schema_id
WHERE 
    so.object_id = 727829805
    and si.index_id = 1;
GO

在SQLserver2014的版本上,我们可以利用无文档的系统视图 sys.dm_db_database_page_allocations ,但是这个查询是一个非常消耗性能的操作。

在看到对象之后我们可以继续查找锁定的数据,同样的这个操作也是消耗性能的操作 (sqlserver2008版本以上) ,如下:

use DBName

SELECT 
    sys.fn_PhysLocFormatter (%%physloc%%),
    *
FROM dbo.TableName (NOLOCK)
WHERE sys.fn_PhysLocFormatter (%%physloc%%) like '(1:1635088%'
GO

(二)

对于KEY: 6:72057594041991168 (ce52f92a058c)

database =6;

hotbt_id=72057594041991168

hash value=ce52f92a058c

同样的我们通过如下的脚本获取对象

--get database name 
select db_name(6) ;

--get object name and index name 
use databasename;

SELECT 
    sc.name as schema_name, 
    so.name as object_name, 
    si.name as index_name
FROM sys.partitions AS p
JOIN sys.objects as so on 
    p.object_id=so.object_id
JOIN sys.indexes as si on 
    p.index_id=si.index_id and 
    p.object_id=si.object_id
JOIN sys.schemas AS sc on 
    so.schema_id=sc.schema_id
WHERE hobt_id = 72057594041991168;
GO

对于最后的hash value ,我们也有函数找到对应的行数据

SELECT
    *
FROM dbo.TableName(NOLOCK)
WHERE %%lockres%% = '(ce52f92a058c)';
GO

猜你喜欢

转载自www.cnblogs.com/sky1225/p/9646935.html