Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags more
Archives
Today
Total
관리 메뉴

ERP World

[MSSQL] Lock Tree 보기 본문

Microsoft/Database

[MSSQL] Lock Tree 보기

swanseo 2018. 1. 23. 19:42

Lock이 발생하는 경우 Tree 형태로 해당 세션을 조회할 수 있는 쿼리이다.

SET NOCOUNT ON; 
SET CONCAT_NULL_YIELDS_NULL OFF 
GO 

WITH Blockers (SPID, Blocked, Level, Batch, WaitType, LastWaitType) 
AS 
( 
    SELECT  SPID, 
            Blocked, 
            CAST(REPLICATE('0', 4 - LEN(CAST(SPID AS VARCHAR))) + CAST(SPID AS VARCHAR) AS VARCHAR(1000)) AS Level, 
            REPLACE(REPLACE(T.TEXT, CHAR(10), ' '), CHAR(13), ' ') AS Batch, 
            R.WaitType, 
            R.LastWaitType 
    FROM    sys.SysProcesses R WITH (NOLOCK) CROSS APPLY sys.dm_exec_sql_text(R.SQL_Handle) T 
    WHERE   (Blocked = 0 OR Blocked = SPID) 
    AND     EXISTS (
                SELECT  SPID, Blocked, CAST(REPLICATE('0', 4 - LEN (CAST(SPID AS VARCHAR))) + CAST(SPID AS VARCHAR) AS VARCHAR(1000)) AS Level, 
                        Blocked, REPLACE (REPLACE (T.TEXT, CHAR(10), ' '), CHAR(13), ' ') AS Batch, 
						R.WaitType ,R.LastWaitType 
                FROM    sys.sysprocesses R2 WITH (NOLOCK) CROSS APPLY sys.dm_exec_sql_text(R.SQL_Handle) T 
                WHERE   R2.Blocked = R.SPID 
                AND     R2.Blocked <> R2.SPID ) 
    UNION ALL 
    SELECT  R.SPID, 
            R.Blocked, 
            CAST(Blockers.LEVEL + RIGHT(CAST((1000 + R.SPID) AS VARCHAR(100)), 4) AS VARCHAR(1000)) AS Level, 
            REPLACE(REPLACE(T.TEXT, CHAR(10), ' '), CHAR(13), ' ') AS BATCH, 
            R.WaitType, 
            R.LastWaitType 
    FROM    sys.sysprocesses AS R WITH (NOLOCK) CROSS APPLY SYS.DM_EXEC_SQL_TEXT(R.SQL_HANDLE) T 
    INNER JOIN Blockers ON R.BLOCKED = BLOCKERS.SPID WHERE R.BLOCKED > 0 AND R.BLOCKED <> R.SPID 
)
SELECT  REPLICATE('│   ', LEN(Level) / 4 - 2) + CASE WHEN (LEN(Level)/4 - 1) = 0 THEN 'HEAD ─ ' ELSE '├─ ' END + CAST(SPID AS VARCHAR (10)) AS "Blocking Tree", 
		Batch AS "SQL Statement",
		CAST(RTRIM(LTRIM(SUBSTRING(CAST(ses.CONTEXT_INFO AS VARCHAR(128)), CHARINDEX(' ', CAST(ses.CONTEXT_INFO AS VARCHAR(128)), 2), CHARINDEX(' ', CAST(ses.CONTEXT_INFO AS VARCHAR(128)), CHARINDEX(' ', CAST(ses.CONTEXT_INFO AS VARCHAR(128)), 2) + 1) - CHARINDEX(' ', CAST(ses.CONTEXT_INFO AS VARCHAR(128)), CHARINDEX(' ', CAST(ses.CONTEXT_INFO AS VARCHAR(128)), 2))))) AS BIGINT) AS AXSession,
		RTRIM(LTRIM(SUBSTRING(CAST(ses.CONTEXT_INFO AS VARCHAR(128)),1,CHARINDEX(' ', CAST(ses.CONTEXT_INFO AS VARCHAR(128)), 2)))) AS AXUser,
        WaitType,
        LastWaitType,
		ses.Host_Name,
		ses.Login_Name,
		ses.Program_Name,
        GETDATE() AS Time 
FROM    Blockers b WITH (NOLOCK)
LEFT JOIN sys.dm_exec_sessions ses ON b.spid = ses.session_id
ORDER BY Level ASC;

 

'Microsoft > Database' 카테고리의 다른 글

[MSSQL] SA 계정 비밀번호 초기화  (0) 2018.01.23
[MSSQL] Index Rebuild 스크립트  (0) 2018.01.23
Comments