ViewProcessBlockingLite

USE [master]
GO

/****** Object:  StoredProcedure [dbo].[ViewProcessBlockingLite]    Script Date: 7/10/2013 4:21:54 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

IF EXISTS (SELECT 1 FROM sys.objects WHERE name = 'ViewProcessBlockingLite' AND type = 'P')
    DROP PROC ViewProcessBlockingLite
GO

CREATE PROC [dbo].[ViewProcessBlockingLite]
AS
BEGIN
SET NOCOUNT ON;

SELECT
             s.spid AS SPID, BlockingSPID = s.blocked, DatabaseName = DB_NAME(s.dbid),
             s.program_name, s.loginame, s.hostname, s.login_time, s.last_batch, s.waittime, s.waitresource,
             ObjectName = OBJECT_NAME(objectid, s.dbid), Definition = CAST(text AS VARCHAR(MAX))
 INTO        #Processes
 FROM      sys.sysprocesses s
 CROSS APPLY sys.dm_exec_sql_text (sql_handle)
 WHERE
            s.spid > 50
;

WITH Blocking(SPID, BlockingSPID, DB, BlockingObject, [Blocking Statement / Definition], program, login, host, login_time, last_batch, waittime_ms, waitresource, RowNo, LevelRow)
 AS
 (
      SELECT
       s.SPID, s.BlockingSPID, s.DatabaseName, s.ObjectName, s.Definition,
       s.program_name, s.loginame, s.hostname, s.login_time, s.last_batch, s.waittime, s.waitresource,
       ROW_NUMBER() OVER(ORDER BY s.SPID),
       0 AS LevelRow
     FROM
       #Processes s
       JOIN #Processes s1 ON s.SPID = s1.BlockingSPID
     WHERE
       s.BlockingSPID = 0
     UNION ALL
     SELECT
       r.SPID,  r.BlockingSPID, r.DatabaseName, r.ObjectName, r.Definition,
       r.program_name, r.loginame, r.hostname, r.login_time, r.last_batch, r.waittime, r.waitresource,
       d.RowNo,
       d.LevelRow + 1
     FROM
       #Processes r
      JOIN Blocking d ON r.BlockingSPID = d.SPID
     WHERE
       r.BlockingSPID > 0
 )
 SELECT *
 INTO #BlockTree
 FROM Blocking
 ORDER BY RowNo, LevelRow

-- Top HEAD SPID
DECLARE @topHeadSPID int
SELECT TOP 1 @topHeadSPID = SPID
    FROM #BlockTree WHERE LevelRow = 0 ORDER BY last_batch

-- filter duplicated rows & trim statement column
SELECT DISTINCT
SPID, BlockingSPID, DB, BlockingObject, LEFT([Blocking Statement / Definition], 100) AS [Statement/Definition (first 100 chars)], program, [login], host, login_time, last_batch, waittime_ms, waitresource
INTO #temp1
FROM #BlockTree

-- insert top head into result
SELECT TOP 1 * INTO #result FROM #temp1 WHERE SPID = @topHeadSPID

-- insert top 10 victims of top head into result
INSERT #result SELECT TOP 10 * FROM #temp1 WHERE BlockingSPID = @topHeadSPID ORDER BY waittime_ms DESC

SELECT * FROM #result ORDER BY BlockingSPID, waittime_ms DESC

DROP TABLE #result
DROP TABLE #temp1
DROP TABLE #BlockTree
DROP TABLE #Processes

END

GO


No comments:

Post a Comment