Herkese merhaba,

Bu yazıda SQL Server’da engellemeleri izlemek ile ilgili bilgi vermeye çalışacağım.

SQL Server’da bazı durumlarda yaşanan engellemeleri, beklemeleri izlemek isteyebilirsiniz.

Aşağıdaki kodu kullanarak siz de bu işlemi rahatlıkla yapabilirsiniz.

SET NOCOUNT ON;
GO
SELECT spid,
       blocked,
       REPLACE(REPLACE(T.text, CHAR(10), ' '), CHAR(13), ' ') AS BATCH
INTO #T
FROM sys.sysprocesses R
    CROSS APPLY sys.dm_exec_sql_text(R.sql_handle) T;
GO
WITH BLOCKERS (SPID, BLOCKED, LEVEL, BATCH)
AS (SELECT spid,
           blocked,
           CAST(REPLICATE('0', 4 - LEN(CAST(spid AS VARCHAR))) + CAST(spid AS VARCHAR) AS VARCHAR(1000)) AS LEVEL,
           BATCH
    FROM #T R
    WHERE (
              blocked = 0
              OR blocked = spid
          )
          AND EXISTS
    (
        SELECT * FROM #T R2 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,
           R.BATCH
    FROM #T AS R
        INNER JOIN BLOCKERS
            ON R.blocked = BLOCKERS.SPID
    WHERE R.blocked > 0
          AND R.blocked <> R.spid)
SELECT N'    ' + REPLICATE(N'|         ', LEN(LEVEL) / 4 - 1) + CASE
                                                                    WHEN (LEN(LEVEL) / 4 - 1) = 0 THEN
                                                                        'HEAD -  '
                                                                    ELSE
                                                                        '|------  '
                                                                END + CAST(SPID AS NVARCHAR(10)) + N' ' + BATCH AS BLOCKING_TREE
FROM BLOCKERS
ORDER BY LEVEL ASC;
GO
DROP TABLE #T;
GO

Herkese çalışma hayatında ve yaşamında başarılar kolaylıklar.

193 Kez Okundu

Kategoriler: