ヘッド ブロッカー プロセスの合計ブロック時間を取得するための小さな CTE を作成しましたが、最初に CTE に実行させたいすべてのプロセスを一時テーブルにコピーしてから、これに対してクエリを実行する必要があるかどうかわかりません。 - つまり、クエリの実行中に足元でデータが変更されないようにしたいのですが (最悪の場合)、無限再帰ループになってしまいます!
これは、一時テーブルを含む私の SQL です。パフォーマンス上の理由からテーブルを使用する必要はなく、CTE 内の sysprocesses dmv に直接アクセスする必要はありませんが、これがどのような影響を与える可能性があるかはわかりません。
DECLARE @proc TABLE(
spid SMALLINT PRIMARY KEY,
blocked SMALLINT INDEX blocked_index,
waittime BIGINT)
INSERT INTO @proc
SELECT spid, blocked, waittime
FROM master..sysprocesses
;WITH block_cte AS
(
SELECT spid, CAST(blocked AS BIGINT) [wait_time], spid [root_spid]
FROM @proc
WHERE blocked = 0
UNION ALL
SELECT blocked.spid, blocked.waittime, block_cte.spid
FROM @proc AS blocked
INNER JOIN block_cte ON blocked.blocked = block_cte.spid
)
SELECT root_spid blocking_spid, SUM(wait_time) total_blocking_time
FROM block_cte
GROUP BY root_spid