Technical Article

Show Blocking and Wait time

,

When executed against a database in which blocking occur, below script will report lockType, Object waited for and current Wait times.

The script requires access to master..systables. The script queries syslockInfo (as does sp_lock), but further joins sysprocesses with an interpretation of waitresource matching SQL Server 7.0 and SQL Server 2000.

/* 2001/12/17-JKJ */
set nocount on
go
select 
'Blocking:' As LockStatus, 
cast (mo.req_spid as smallint) As spid,
mo.rsc_dbid As dbid,
mo.rsc_objid As ObjId,
mo.rsc_indid As IndId,
substring (vo.name, 1, 4) As Type,
substring (mo.rsc_text, 1, 16) as Resource,
substring (uo.name, 1, 8) As Mode,
substring (xo.name, 1, 5) As Status,
0 As WaitTime,
substring( object_name(mo.rsc_objid), 1, 24) As Object

from 
master.dbo.syslockinfo mo,
master.dbo.spt_values vo,
master.dbo.spt_values xo,
master.dbo.spt_values uo

where   
mo.rsc_type = vo.number
and vo.type = 'LR'
and mo.req_status = xo.number
and xo.type = 'LS'
and mo.req_mode + 1 = uo.number
and uo.type = 'L'
and substring (xo.name, 1, 5) = 'Grant'
and exists 

(select 1 from 
    master.dbo.syslockinfo mi,
 master.dbo.spt_values vi,
 master.dbo.spt_values xi,
 master.dbo.spt_values ui
 where 
mi.rsc_type = vi.number
and vi.type = 'LR'
and mi.req_status = xi.number
and xi.type = 'LS'
and mi.req_mode + 1 = ui.number
and ui.type = 'L'
and mi.rsc_dbid = mo.rsc_dbid 
and mi.rsc_objid = mo.rsc_objid 
and mi.rsc_indid = mo.rsc_indid 
and substring (vi.name, 1, 4) = substring (vo.name, 1, 4) 
and substring (mi.rsc_text, 1, 16) = substring (mo.rsc_text, 1, 16) 
and substring (xi.name, 1, 5) = 'Wait'
)

union all

select 
'Waiting:' As LockStatus,
cast (m.req_spid as smallint) As spid,
m.rsc_dbid As dbid,
m.rsc_objid As ObjId,
m.rsc_indid As IndId,
substring (v.name, 1, 4) As Type,
substring (rsc_text, 1, 16) as Resource,
substring (u.name, 1, 8) As Mode,
substring (x.name, 1, 5) As Status,
sp.waittime as WaitTime,
substring( object_name(m.rsc_objid), 1, 24) As Object

from 
master.dbo.syslockinfo m,
master.dbo.spt_values v,
master.dbo.spt_values x,
master.dbo.spt_values u,
master.dbo.sysprocesses sp

where   
m.rsc_type = v.number
and v.type = 'LR'
and m.req_status = x.number
and x.type = 'LS'
and m.req_mode + 1 = u.number
and u.type = 'L'
and substring (x.name, 1, 5) = 'Wait'
and cast( sp.spid as smallint ) = cast( m.req_spid as smallint )
  and sp.waitresource = 
case substring( v.name, 1, 3)
when 'RID' then 
substring ( v.name, 1, 3) + ': ' + cast( m.rsc_dbid as varchar(2) ) + ':' + substring (m.rsc_text, 1, 16)
when 'KEY' then
substring ( v.name, 1, 3) + ': ' + cast( m.rsc_dbid as varchar(2) ) + ':' + cast( m.rsc_objid as varchar(30) ) + ':' + cast( m.rsc_indid as varchar(2) ) + ' ' + substring (m.rsc_text, 1, 16)
when 'PAG' then 
substring ( v.name, 1, 3) + ': ' + cast( m.rsc_dbid as varchar(2) ) + ':' + substring (m.rsc_text, 1, 16)
when 'TAB' then 
substring ( v.name, 1, 3) + ': ' + cast( m.rsc_dbid as varchar(2) ) + ':' + cast( m.rsc_objid as varchar(30) ) + ' []'
end

order by

Object, 
WaitTime 

go
set nocount off
go

Rate

You rated this post out of 5. Change rating

Share

Share

Rate

You rated this post out of 5. Change rating