SQL Server怎样查询某一阻塞或X锁持续的时间?

ChinaITOldMan 2013-10-11 02:36:56
SQL Server怎样查询某一阻塞或X锁持续的时间?

...全文
982 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChinaITOldMan 2013-10-11
  • 打赏
  • 举报
回复
哦,谢谢楼上的帮助!
唐诗三百首 2013-10-11
  • 打赏
  • 举报
回复
建议查看一下2个DMV的官方定义, sys.dm_tran_locks : 返回SQL Server中有关当前活动的锁管理器资源的信息。向锁管理器发出的已授予锁或正等待授予锁的每个当前活动请求分别对应一行。 参考 http://technet.microsoft.com/zh-cn/library/ms190345(v=sql.105).aspx sys.dm_os_waiting_tasks : 返回有关正在等待某些资源的任务的等待队列的信息。 参考 http://technet.microsoft.com/zh-cn/library/ms188743.aspx 简单来讲, sys.dm_tran_locks是已经持有锁的进程事务列表. sys.dm_os_waiting_tasks是等待状态的进程列表, 等待包括锁等待(即等待sys.dm_tran_locks中的进程释放锁),IO等待,CPU等待等等... 2者没有可比性.
ChinaITOldMan 2013-10-11
  • 打赏
  • 举报
回复
对不起,我想表达的意思是下面第一条语句的进程是不包括在第二条语句的进程中吧?或是第一条语句的进程与第二条语句的进程有什么关系?谢谢! 第一条语句: select * from sys.dm_tran_locks where request_mode='X' 第二条语句: select * from sys.dm_os_waiting_tasks
LongRui888 2013-10-11
  • 打赏
  • 举报
回复
引用 8 楼 mcxhh2005 的回复:
谢谢! select * from sys.dm_tran_locks where request_mode='X' select wt.session_id, --某个会话 wait_duration_ms / 1000 as 'wait seconds', --等待秒数 wait_type, --等待类型,可能是进程间的阻塞,也有可能是等待IO完成 blocking_session_id, --被这个会话阻塞的,如果有的话 tl.request_mode, --请求模式,比如S、IX、X tl.request_type, --请求类型,比如Lock tl.request_status --是否grant from sys.dm_os_waiting_tasks wt left join sys.dm_tran_locks tl on wt.session_id = tl.request_session_id 我执行上述上下两条语句,为什么第一条语句中的很多记录没有在第二条语句中,若根据下面的解释不是不也应该在第二条语句中呢?谢谢! [quote=引用 5 楼 yupeigu 的回复:]

select session_id,              --某个会话
       wait_duration_ms / 1000, --等待秒数
       wait_type,          --等待类型,可能是进程间的阻塞,也有可能是等待IO完成
       
       blocking_session_id --被这个会话阻塞的,如果有的话
       
from sys.dm_os_waiting_tasks
进一步的:

select wt.session_id,              --某个会话
       wait_duration_ms / 1000 as 'wait seconds', --等待秒数
       wait_type,          --等待类型,可能是进程间的阻塞,也有可能是等待IO完成
       
       blocking_session_id, --被这个会话阻塞的,如果有的话
       
       tl.request_mode,     --请求模式,比如S、IX、X
       tl.request_type,     --请求类型,比如Lock
       tl.request_status    --是否grant

from sys.dm_os_waiting_tasks wt
left join sys.dm_tran_locks tl
       on wt.session_id = tl.request_session_id
 
[/quote] 哦 ,那是因为第二个语句里面主要显示哪些,被其他会话阻塞的会话,对于lock的获取情况,因为往往一个会话获取了锁,会阻塞其他的会话,而第一个是所有会话,不管有没有被其他进程阻塞,都会显示它获取lock的情况
ChinaITOldMan 2013-10-11
  • 打赏
  • 举报
回复
谢谢! select * from sys.dm_tran_locks where request_mode='X' select wt.session_id, --某个会话 wait_duration_ms / 1000 as 'wait seconds', --等待秒数 wait_type, --等待类型,可能是进程间的阻塞,也有可能是等待IO完成 blocking_session_id, --被这个会话阻塞的,如果有的话 tl.request_mode, --请求模式,比如S、IX、X tl.request_type, --请求类型,比如Lock tl.request_status --是否grant from sys.dm_os_waiting_tasks wt left join sys.dm_tran_locks tl on wt.session_id = tl.request_session_id 我执行上述上下两条语句,为什么第一条语句中的很多记录没有在第二条语句中,若根据下面的解释不是不也应该在第二条语句中呢?谢谢!
引用 5 楼 yupeigu 的回复:

select session_id,              --某个会话
       wait_duration_ms / 1000, --等待秒数
       wait_type,          --等待类型,可能是进程间的阻塞,也有可能是等待IO完成
       
       blocking_session_id --被这个会话阻塞的,如果有的话
       
from sys.dm_os_waiting_tasks
进一步的:

select wt.session_id,              --某个会话
       wait_duration_ms / 1000 as 'wait seconds', --等待秒数
       wait_type,          --等待类型,可能是进程间的阻塞,也有可能是等待IO完成
       
       blocking_session_id, --被这个会话阻塞的,如果有的话
       
       tl.request_mode,     --请求模式,比如S、IX、X
       tl.request_type,     --请求类型,比如Lock
       tl.request_status    --是否grant

from sys.dm_os_waiting_tasks wt
left join sys.dm_tran_locks tl
       on wt.session_id = tl.request_session_id
 
發糞塗牆 2013-10-11
  • 打赏
  • 举报
回复
如果语句超长,显示不全,而且如果是调用存储过程,就只有个名字
ChinaITOldMan 2013-10-11
  • 打赏
  • 举报
回复
引用 5 楼 yupeigu 的回复:

select session_id,              --某个会话
       wait_duration_ms / 1000, --等待秒数
       wait_type,          --等待类型,可能是进程间的阻塞,也有可能是等待IO完成
       
       blocking_session_id --被这个会话阻塞的,如果有的话
       
from sys.dm_os_waiting_tasks
进一步的:

select wt.session_id,              --某个会话
       wait_duration_ms / 1000 as 'wait seconds', --等待秒数
       wait_type,          --等待类型,可能是进程间的阻塞,也有可能是等待IO完成
       
       blocking_session_id, --被这个会话阻塞的,如果有的话
       
       tl.request_mode,     --请求模式,比如S、IX、X
       tl.request_type,     --请求类型,比如Lock
       tl.request_status    --是否grant

from sys.dm_os_waiting_tasks wt
left join sys.dm_tran_locks tl
       on wt.session_id = tl.request_session_id
 
谢谢各位的热情帮助 请问不通过dbcc inputbuffer(spid)是否通过楼上的语句可找到每个spid对应执行的语句呢?
LongRui888 2013-10-11
  • 打赏
  • 举报
回复

select session_id,              --某个会话
       wait_duration_ms / 1000, --等待秒数
       wait_type,          --等待类型,可能是进程间的阻塞,也有可能是等待IO完成
       
       blocking_session_id --被这个会话阻塞的,如果有的话
       
from sys.dm_os_waiting_tasks
进一步的:

select wt.session_id,              --某个会话
       wait_duration_ms / 1000 as 'wait seconds', --等待秒数
       wait_type,          --等待类型,可能是进程间的阻塞,也有可能是等待IO完成
       
       blocking_session_id, --被这个会话阻塞的,如果有的话
       
       tl.request_mode,     --请求模式,比如S、IX、X
       tl.request_type,     --请求类型,比如Lock
       tl.request_status    --是否grant

from sys.dm_os_waiting_tasks wt
left join sys.dm_tran_locks tl
       on wt.session_id = tl.request_session_id
 
發糞塗牆 2013-10-11
  • 打赏
  • 举报
回复
sessionid是被阻塞的,而元凶是另外一个字段:blocking_session_id,wait_duration_ms按照联机丛书的解释是milliseconds
ChinaITOldMan 2013-10-11
  • 打赏
  • 举报
回复
谢谢版主! 1. 请问SELECT session_id,wait_duration_ms FROM sys.dm_os_waiting_tasks语句中的sessin_ID是被阻塞进程的ID吗? 2. wait_duration_ms是微秒吧?
發糞塗牆 2013-10-11
  • 打赏
  • 举报
回复
x锁的持有时间好像要查索引的,我现在没脚本
發糞塗牆 2013-10-11
  • 打赏
  • 举报
回复
SELECT session_id,wait_duration_ms FROM sys.dm_os_waiting_tasks阻塞时间

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧