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 DBNameselect * from sys.database_files where file_id =113. 通過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 = 727829805and si.index_id = 1; GO?
在SQLserver2014的版本上,我們可以利用無文檔的系統視圖?sys.dm_db_database_page_allocations ,但是這個查詢是一個非常消耗性能的操作。
在看到對象之后我們可以繼續查找鎖定的數據,同樣的這個操作也是消耗性能的操作 (sqlserver2008版本以上) ,如下:
use DBNameSELECT 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?
轉載于:https://www.cnblogs.com/sky1225/p/9646935.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的SQLServer 阻塞的等待类型解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 流程控制之for
- 下一篇: python中的__iter__ __r