zoukankan      html  css  js  c++  java
  • 等待资源(wait_resource)解码(完整版)

    在调查阻塞或死锁时,你可能很想知道阻塞的等待资源(wait_resource)是什么,通常等待资源的类型是Page、Key和RID,它们的格式分别是:

    waitresource="PAGE: 6:3:70133 "
    waitresource="KEY: 6:72057594041991168 (ce52f92a058c)"
    waitresource="RID: 6:15:11695844:3"

    从等待资源的格式中可以看出,不同类型的等待资源,其资源描述符是不同的,通过资源描述符的各个成分,可以探测到阻塞发生的时候,竞争的临界资源到底是什么。

    一,等待资源PAGE

    对于等待资源是PAGE的情况,PAGE的格式是 Database_Id : File_Id : PageNumber,如下所示:

    waitresource=“PAGE: 6:3:70133 ” = Database_Id : FileId : PageNumber

    每个Page的Header中都包含所属的table对象的信息,据此可以查询出竞争的资源是哪一个表的数据页。

    1,查看Page Header的信息

    根据以上信息,可以使用DBCC PAGE来查看page header的信息:

    DBCC TRACEON (3604);
    GO
    /* DBCC PAGE (DatabaseName, FileNumber, PageNumber, DumpStyle)*/
    DBCC PAGE ('WideWorldImporters',3,70133,2);
    GO

    比较重要的字段是:ObjectID 和 IndexId 字段,如下图所示:

    2,查看Page的内容

    根据DBCC PAGE返回的内容,可以使用 %%physloc%% 来查看Page上数据行的定位器。在Page上,每一个数据行都可以通过一个索引来寻址,该索引就是数据行的定位器。

    SELECT 
        sys.fn_PhysLocFormatter (%%physloc%%) AS PhysLoc,
        *
    FROM table WITH(NOLOCK)
    WHERE sys.fn_PhysLocFormatter (%%physloc%%) like '(3:70133%'

    二,等待资源Key

    对于等待的资源是Key的情况,该阻塞发生在聚集索引上,Key资源的格式是 database_id, hobt_id (Magic Hash),其中 Magic Hash的某一个数据行的哈希值:

     waitresource=“KEY: 6:72057594041991168 (ce52f92a058c)” = Database_Id, HOBT_Id ( Magic Hash )

    把该等待资源拆分成三个部分,分别是:

    • database_id = 6
    • hobt_id = 72057594041991168
    • magic hash value = (ce52f92a058c)

    通过视图 sys.partitions 来查看hobt_id对应的object_id,使用%%lockres%% 来解码 Magic Hash。

    如果想知道具体锁定的数据行,可以使用%%lockres%%函数来找到对应的数据行。

    SELECT *
    FROM table WITH(NOLOCK)
    WHERE %%lockres%% = '(ce52f92a058c)';

    三,等待资源RID

    对于等待资源是RID的情况,阻塞发生在heap上,也就是说,RID等待只会发生在没有创建聚集索引的表上,RID等待资源各描述符的含义如下:

    waitresource="RID: 6:15:11695844:3"= Databae_Id:File_Id:Page_Id:Slot_No

    把该资源描述符拆分成4部分,分别是:

    • database_id = 6
    • file_id = 15
    • page_id = 11695844
    • slot_no = 3

    该描述符表示等待的资源某一个特定的行,数据行存储在Page上,Page的底部是行偏移(Row Offsets),每一行的偏移量连续排列在Page的末尾,称作槽数组(Slot Array),每一个slot中存储的都是行在Page中的偏移量。

    通过slot可以查找到指定的row在Page中所在的位置,并可以通过DBCC PAGE()命令查看每个slot对应的数据行的内容。

    四,等待资源 OBJECT和TABLE

    等待资源 OBJECT 和 TABLE的解码非常简单

    1,OBJECT等待资源

    对于等待资源是OBJECT的情况,等待资源各描述符的含义如下:

    waitresource="OBJECT: 6:12347015633:1 "=Database_Id:Object_Id:PageNumber

    第三个字段是PageNumber,通过PageNumber,可以还原阻塞发生的现场情况,真正阻塞的临界资源是一个Page。

    2,TAB等待资源

    对于等待资源是TAB的情况,等待资源各描述符的含义如下:

    waitresource="TAB: 5:261575970:1"=DatabaseID:ObjectID:IndexID

    在阻塞发生时,数据库应该正在做全表扫描操作,阻塞发生在一个小表或小索引上,查询在请求资源时把整个表都锁定了。

    参考文档:

    INF: Understanding and resolving SQL Server blocking problems

    Decoding Key and Page WaitResource for Deadlocks and Blocking

    SQL server: Deciphering Wait resource

  • 相关阅读:
    python mysql Connect Pool mysql连接池 (201
    mysql: see all open connections to a given database?
    mysql int(3)与int(11)的区别
    Configure Amazon RDS mysql to store Chinese Characters
    Maximum length of a table name in MySQL
    JDBC Tutorials: Commit or Rollback transaction in finally block
    Java transient关键字使用小记
    Java构造和解析Json数据的两种方法详解二
    精选30道Java笔试题解答
    Visual Studio最好用的快捷键(你最喜欢哪个)
  • 原文地址:https://www.cnblogs.com/ljhdo/p/10533774.html
Copyright © 2011-2022 走看看