Sp block--check analyse blocked processes
From SybaseWiki
This sp checks for blocked processes and, if found, returns the spid info, sql text and query plan. It requires sp__mon_sql2 and sp__capture_sql.
It could do with some extra work to filter out the spids which are not the root blocking spids; it can produce a large amount of output if there are a high number of individual spids involved in a chain of blocks.
create proc sp__block as ------------------------------ -- Procedure: sp__block -- Created: April 2008 -- Author: Bob Holmes -- Last modification: -- Dependencies: sp__mon_sql2, sp__capture_sql ------------------------------ declare @numblocks int select @numblocks = count(*) from master..sysprocesses where blocked <> 0 -- list blocked processes print " %1! Blocked Processes", @numblocks print " ==============================================================================================" print " duration" select spid, convert(char(12),suser_name(suid)) login, convert(char(16),db_name(dbid)) db, hostname, blocked "blocked by", convert(varchar(9),StartTime,108) StartTime, right( replicate("0", 2) + convert(varchar(2),(time_blocked/60/60)),2) + ":" +right( replicate("0", 2) + convert(varchar(2),((time_blocked/60)-((time_blocked/60/60)*60))),2) + ":" + right( replicate("0", 2) + convert(varchar(2),(time_blocked%60)),2) "hh:mm:ss", cmd Command from master..sysprocesses, master..monProcessStatement where blocked <> 0 and spid = SPID if @numblocks <> 0 begin --prep list of blocking spids select distinct blocked into #blockingspids from master..sysprocesses where blocked <> 0 declare @spid int --get spid info: summary, sql, query plan select @spid = min(blocked) from #blockingspids while @spid >= (select min(blocked) from #blockingspids) begin print "" exec sp__mon_sql2 @spid exec sp__capture_sql @spid exec sp_showplan @spid, null, null, null print "Tables in use by Spid %1!", @spid print "-----------------------------" select a.SPID, convert(char(12),a.Login) Login, convert(char(15),a.ClientHost), convert(char(15),a.ClientIP) ClientIP, convert(char(15),b.DBName) DBName, b.ObjectName, c.LogicalReads, c.PhysicalReads, c.PhysicalWrites, b.TableSize from master..monProcessLookup a, master..monProcessObject b, master..monProcessActivity c where a.SPID = b.SPID and b.SPID = c.SPID and a.SPID = @spid order by c.PhysicalWrites desc if (@spid = (select max(blocked) from #blockingspids)) or (@spid = null) break select @spid = min(blocked) from #blockingspids where blocked > @spid end end return