阻塞
运行下面的查询可确定阻塞的会话。
- select blocking_session_id, wait_duration_ms, session_id from
- sys.dm_os_waiting_tasks
- where blocking_session_id is not null
使用此调用可找出 blocking_session_id 所返回的 SQL。例如,如果 blocking_session_id 是 87,则运行此查询可获得相应的 SQL。
- dbcc INPUTBUFFER(87)
下面的查询显示 SQL 等待分析和前 10 个等待的资源。
- select top 10 *
- from sys.dm_os_wait_stats
- --where wait_type not in ('CLR_SEMAPHORE','LAZYWRITER_SLEEP','RESOURCE_QUEUE','SLEEP_TASK','SLEEP_SYSTEMTASK','WAITFOR')
- order by wait_time_ms desc
若要找出哪个 spid 正在阻塞另一个 spid,可在数据库中创建以下存储过程,然后执行该存储过程。此存储过程会报告此阻塞情况。键入 sp_who 可找出 @spid;@spid 是可选参数。
- create proc dbo.sp_block (@spid bigint=NULL)
- as
- select
- t1.resource_type,
- 'database'=db_name(resource_database_id),
- 'blk object' = t1.resource_associated_entity_id,
- t1.request_mode,
- t1.request_session_id,
- t2.blocking_session_id
- from
- sys.dm_tran_locks as t1,
- sys.dm_os_waiting_tasks as t2
- where
- t1.lock_owner_address = t2.resource_address and
- t1.request_session_id = isnull(@spid,t1.request_session_id)
以下是使用此存储过程的示例。
- exec sp_block
- exec sp_block @spid = 7
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。