欢迎投稿

今日深度:

监控SQL Server的运行状况(1)(3)

阻塞

运行下面的查询可确定阻塞的会话。

  1. select blocking_session_id, wait_duration_ms, session_id from  
  2. sys.dm_os_waiting_tasks 
  3. where blocking_session_id is not null 

使用此调用可找出 blocking_session_id 所返回的 SQL。例如,如果 blocking_session_id 是 87,则运行此查询可获得相应的 SQL。

  1. dbcc INPUTBUFFER(87) 

下面的查询显示 SQL 等待分析和前 10 个等待的资源。

  1. select top 10 * 
  2. from sys.dm_os_wait_stats 
  3. --where wait_type not in ('CLR_SEMAPHORE','LAZYWRITER_SLEEP','RESOURCE_QUEUE','SLEEP_TASK','SLEEP_SYSTEMTASK','WAITFOR') 
  4. order by wait_time_ms desc 

若要找出哪个 spid 正在阻塞另一个 spid,可在数据库中创建以下存储过程,然后执行该存储过程。此存储过程会报告此阻塞情况。键入 sp_who 可找出 @spid;@spid 是可选参数。

  1. create proc dbo.sp_block (@spid bigint=NULL
  2. as 
  3. select  
  4.     t1.resource_type, 
  5.     'database'=db_name(resource_database_id), 
  6.     'blk object' = t1.resource_associated_entity_id, 
  7.     t1.request_mode, 
  8.     t1.request_session_id, 
  9.     t2.blocking_session_id     
  10. from  
  11.     sys.dm_tran_locks as t1,  
  12.     sys.dm_os_waiting_tasks as t2 
  13. where  
  14.     t1.lock_owner_address = t2.resource_address and 
  15.     t1.request_session_id = isnull(@spid,t1.request_session_id) 

以下是使用此存储过程的示例。

  1. exec sp_block 
  2. exec sp_block @spid = 7 


www.htsjk.Com true http://www.htsjk.com/shujukugl/17743.html NewsArticle 阻塞 运行下面的查询可确定阻塞的会话。 select blocking_session_id,wait_duration_ms,session_id from sys.dm_os_waiting_tasks where blocking_session_id is not null 使用此调用可找出...
评论暂时关闭