等待资源(wait_resource)解码

在调查阻塞或死锁时,你可能会遇到等待资源(wait_resource),通常等待的资源是Page或Key:

waitresource=“PAGE: 6:3:70133 “
waitresource=“KEY: 6:72057594041991168 (ce52f92a058c)“

等待资源的类型是Page或索引键,从等待资源可以探测出,阻塞发生时,竞争的资源到底是什么内容。

一,等待资源是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)‘;

参考文档:

Decoding Key and Page WaitResource for Deadlocks and Blocking

原文地址:https://www.cnblogs.com/ljhdo/p/11964292.html

时间: 2024-11-09 03:22:22

等待资源(wait_resource)解码的相关文章

初涉SQL Server性能问题(2/4):列出等待资源的会话

原文:初涉SQL Server性能问题(2/4):列出等待资源的会话 在初涉SQL Server性能问题(1/4)里,我们知道了如何快速检查服务器实例上正运行的任务数和IO等待的任务数.这个是轻量级的脚本,不会给服务器造成任何压力,即使服务器在高负荷下,也可以正常获得结果. 问题检测的第2步是获取在进行任何资源等待的会话.下面的脚本会帮助我们获得这些信息.这个查询需要预建立一个函数,如果会话是由SQL Server代理启动的话,会显示具体的作业名. 1 /********************

译码阻塞和死锁的等待资源

译码阻塞和死锁的等待资源 常用等待资源介绍 以下表格列出了常用等待资源的格式和意义. Resource Format Example Table DatabaseID:ObjectID:IndexID TAB: 5:261575970:1           In this case, database ID 5 is the pubs sample database and object ID 261575970 is the titles table and 1 is the cluster

mysql死锁,等待资源,事务锁,Lock wait timeout exceeded; try restarting transaction解决

前面已经了解了InnoDB关于在出现锁等待的时候,会根据参数innodb_lock_wait_timeout的配置,判断是否需要进行timeout的操作,本文档介绍在出现锁等待时候的查看及分析处理: 在InnoDB Plugin之前,一般通过show full processlist(很难发现被锁的行记录问题所在)和show engine innodb status命令查看当前的数据库请求,然后再判断当前事务中锁的情况.随着mysql的发展,已经提供更加便捷的方法来监控数据库中的锁等待现象了.

ORA-00060:等待资源时检测到死锁的一种处理方法

先执行脚本: SELECT p.sipid, a.serial#, c.object_name, b.session_id, b.oracle_username, b.os_user_name FROM v$process p, v$session a, v$locked_object b, all_objects c WHERE p.addr = a.paddr AND a.process = b.process AND c.object_id = b.object_id; 再执行脚本,其中逗

等待资源时检测到死锁

在项目运行过程中,某天突然现场反应这样的一个问题,经排查,为软件系统的保存事物中 对订单表和订单月表进行了回写,但是另外其他业务系统在oracle触发器中,有一套逻辑,根据订单量来如果实发量大于订单量则更改月表状态字段.这样导致两个系统中两个事物对同一张表产生了调用占用死锁. 原文地址:https://www.cnblogs.com/xiaoxihebei/p/9027766.html

oracle中“ORA-00060: 等待资源时检测到死锁” 或存储过程编译卡死 解决方法

之前在调试存储过程时,出现卡死情况,无法插入数据 解决方法 1.查看那些表被锁住: --1.查看那些表被锁住--- select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id; 2.查看引起死锁的会话: --3.查看引起死锁会话-- select b.username,b.sid,b.serial#,logo

sql server 性能调优 资源等待之PAGEIOLATCH_x

一.概念 在介绍资源等待PAGEIOLATCH_x之前,先来了解下从实例级别来分析的各种资源等待的dmv视图sys.dm_os_wait_stats.它是返回执行的线程所遇到的所有等待的相关信息,该视图是从一个实际级别来分析的各种等待,它包括200多种类型的等待,主要关注的包括了PageIoLatch磁盘I/O读写的等待时间,LCK_xx锁的等待时间,日志WriteLog写入等待,页上闩锁PageLatch等待以及其它. 1.  下面根据总耗时排序来观察,这里分析的等待的wait_type 不包

sql server 性能调优之 资源等待PAGEIOLATCH

原文:sql server 性能调优之 资源等待PAGEIOLATCH 一.概念 在介绍资源等待PAGEIOLATCH之前,先来了解下从实例级别来分析的各种资源等待的dmv视图sys.dm_os_wait_stats.它是返回执行的线程所遇到的所有等待的相关信息,该视图是从一个实际级别来分析的各种等待,它包括200多种类型的等待,需要关注的包括PageIoLatch(磁盘I/O读写的等待时间),LCK_xx(锁的等待时间),WriteLog(日志写入等待),PageLatch(页上闩锁)Cxpa

快速获取DB服务器当前 MEM CPU的资源消耗

USE DBA_Maintenance GO IF EXISTS (SELECT 1 FROM SYS.PROCEDURES WHERE type='p' AND NAME='SP_CheckMemAndCpu') BEGIN DROP PROCEDURE SP_CheckMemAndCpu END GO CREATE PROCEDURE SP_CheckMemAndCpu AS BEGIN SET NOCOUNT ON --check Mem select (1.0*total_physica