领先拦截者查询

问题描述 投票:0回答:1
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

这是找出阻塞的好查询还是我们有更好的选择?

尝试查找阻止查询,其中不断更改 spid

sql-server t-sql blocking sql-server-2019 spid
1个回答
0
投票

不熟悉 API,但至少我会用另一个 CTE 替换临时表。这也让我们摆脱了所有额外的批次分隔符:

WITH R AS 
(
    SELECT SPID, BLOCKED
        ,REPLACE(REPLACE (T.TEXT, CHAR(10), ' '), CHAR (13), ' ' ) AS BATCH
    FROM sys.sysprocesses R 
    CROSS APPLY sys.dm_exec_sql_text(R.SQL_HANDLE) T
)
, 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 R
    WHERE (BLOCKED = 0 OR BLOCKED = SPID)
        AND EXISTS (SELECT * FROM R 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 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
© www.soinside.com 2019 - 2024. All rights reserved.