sys.dm_exec_requests中statement_start_offset与statement_end_offset

news/2024/7/5 2:56:22

文章目录

  • 1.缘起
  • 2.根因
  • 3.示例
  • 4.附录

1.缘起

mssql中查早阻塞与及其相关联的sql时,遇到如下内容,故记录一下,

substring(dest_blocked.text,der.statement_start_offset/2+1,(case when der.statement_end_offset=-1 then  DATALENGTH(der.statement_end_offset)
	 else der.statement_end_offset end-der.statement_start_offset)/2+1) as blocked_statement

2.根因

statement_start_offset与statement_end_offset主要用于定位sql的起始与结束位置,但是为何要/2+1,从网路上查询得知:

It's because data returned from sys.dm_exec_sql_text function is in Unicode. 
1 character takes 2 bytes. The SUBSTRING works on character data types (not on bytes). 
So we need to divide the number of bytes by 2 + 1 to have location of the first character in SQL Query that is inside text.

主要是因为sys.dm_exec_sql_text返回的offset是unicode,也就是说返回的是bytes数,1个字符要占用2个bytes,而substring使用character为单位取值,故需要除以2

3.示例

看一下示例:
主要用于返回substring取值的sql与不使用substring取值的完整sql
substring取值的sql

select 'a' as A_query,der.session_id,der.statement_start_offset,der.statement_end_offset, substring(dest.text,der.statement_start_offset/2+1,(case when der.statement_end_offset= -1 then datalength(dest.text)
else der.statement_end_offset end - der.statement_start_offset)/2+1) as statement from sys.dm_exec_requests der
cross apply sys.dm_exec_sql_text(der.sql_handle) dest
union
select 'b' as b_query,der.session_id,der.statement_start_offset,der.statement_end_offset, dest.text as statement from sys.dm_exec_requests der
cross apply sys.dm_exec_sql_text(der.sql_handle) dest
order by session_id

返回如下:
在这里插入图片描述
注意上图中的A_query字段:
a 代表使用substring取值的sql
b 代表不使用substring取值的完整sql

如下,是返回的完整sql:
substring取值的sql(sql_1)

EXECUTE [cmCriticalManufacturingODSLink]..[dbo].sp_executesql @sqlcommand, N'@sqlrowcnt int OUTPUT', @sqlrowcnt=@sqlrowcnt output

不使用substring取值的完整sql(sql_2)

(@sqlcommand nvarchar(max),@sqlrowcnt As int OUTPUT)EXECUTE [cmCriticalManufacturingODSLink]..[dbo].sp_executesql @sqlcommand, N'@sqlrowcnt int OUTPUT', @sqlrowcnt=@sqlrowcnt output

由于statement_start_offset返回是104个bytes,换算成字符就是52个字符
比对上面sql_1与sql_2,可以看到sql_1刚好从第53个字符开始截取,这也就是要+1的原因

4.附录

标题1中的完整sql:

select dtl.resource_type,
case when dtl.resource_type in ('database','file','metadata') then resource_type
     when dtl.resource_type in ('object') then object_name(dtl.resource_associated_entity_id,dtl.resource_database_id) 
	 when dtl.resource_type in ('key','page','rid') then (select object_name(object_id,dtl.resource_database_id) from sys.partitions where hobt_id=dtl.resource_associated_entity_id)
	 else 'unidentifer' end as parent_object,
	 dtl.request_mode,
	 dtl.request_status,
	 dowt.wait_duration_ms,
	 dowt.wait_type,
	 dowt.session_id as blocked_session_id,
	 des_blocked.login_name as blocked_user,
	 substring(dest_blocked.text,der.statement_start_offset/2+1,(case when der.statement_end_offset=-1 then  DATALENGTH(der.statement_end_offset)
	 else der.statement_end_offset end-der.statement_start_offset)/2+1) as blocked_statement,
	 dowt.blocking_session_id,
	 der.blocking_session_id,
	 des_blocking.login_name,
	 dest_blocking.text,
	 dowt.resource_description
	 from sys.dm_tran_locks dtl 
join sys.dm_os_waiting_tasks dowt on dtl.lock_owner_address=dowt.resource_address
join sys.dm_exec_requests der on dowt.session_id=der.session_id
join sys.dm_exec_sessions des_blocked on dowt.session_id=des_blocked.session_id
join sys.dm_exec_sessions des_blocking on dowt.blocking_session_id=des_blocking.session_id
join sys.dm_exec_connections dec on des_blocking.session_id=dec.most_recent_session_id
cross apply sys.dm_exec_sql_text( dec.most_recent_sql_handle) dest_blocking
cross apply sys.dm_exec_sql_text( der.sql_handle) as dest_blocked
where dtl.resource_database_id=db_id() and dtl.resource_type not in ('database','file') 


http://lihuaxi.xjx100.cn/news/1721055.html

相关文章

适应还是不适应?语义分割的实时自适应方法

文章信息 论文题目为《To Adapt or Not to Adapt? Real-Time Adaptation for Semantic Segmentation》,该文于2023年发表于IEEE/CVF International Conference on Computer Vision (ICCV)会议上。文章提出一种用于实时域自适应的硬件感知模块化最便宜的训练框架&am…

零基础Linux_23(多线程)线程安全+线程互斥(加锁)+死锁

目录 1. 线程安全 1.1 线程不安全前期 1.2 线程不安全原因 2. 线程互斥 2.1 加锁保护(代码) 2.2 锁的本质 3. 可重入对比线程安全 4. 死锁 4.1 死锁的必要条件 4.2 避免死锁 5. 笔试面试题 答案及解析 本篇完。 1. 线程安全 基于上一篇线程…

python实现ModBusRTU客户端

python实现基于串口通信的ModBusRTU客户端是一件简单的事情,只要通过pymodbus模块就可以实现。 一、关于ModbusRTU 1、什么是ModbusRTU Modbus RTU(Remote Terminal Unit)是一种串行通信协议,用于在工业自动化系统中传输数据。它…

2023NOIP A层联测18-划分

对于一个长度为 n n n 的 01 字符串 S S S,请你求出将其分为至少 k k k 段,将每一段看为二进制数求和后的最大值以及取到这个最大值的划分方案的数量。 n ≤ 2 1 0 6 n\le2\times10^6 n≤2106 字符串编号从 1 1 1 开始。 若 n k nk nk&#xff0…

Java基于ssm+vue开发的失物招领小程序

演示视频: 小程序 https://www.bilibili.com/video/BV1sg4y1d75T/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07ae139b 管理员 https://www.bilibili.com/video/BV1UH4y167xe/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07a…

解决vi编辑器方向按键和删除按键无法使用问题

1.解决上下左右键出现ABCD现象 首先执行 echo "set nocp" >> ~/.vimrc 再执行下面代码即可 source ~/.vimrc 2.解决删除键无法使用现象 首先执行 echo "set backspace2" >> ~/.vimrc 再执行下面代码即可 source ~/.vimrc

2011-2021年北大数字普惠金融指数数据(包括省市县)第四期

2011-2021年北大省市县数字普惠金融指数数据(第四期) 1、时间:2011-2021年 2、指标:index_aggregate、coverage_breadth、usage_depth、payment、insurance、monetary_fund、investment、credit、credit_investigation、digitiz…

RK3399平台开发系列讲解(基础篇)嵌入式编码规范有哪些

🚀返回专栏总目录 文章目录 一、什么是GNU二、GNU C 编码规范2.1、格式2.2、注释2.3、语法约定2.4、命名2.5、系统可移植性2.6、CPU 可移植性2.7、系统函数2.8、国际化2.9、字符集沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 GNU 编码规范的出发点,是确保所有 G…