1

我有一个在晚上运行的 SP,有时它不会完成。我使用自动化运行的工具有一个选项,如果它没有完成,它可以在一段时间后终止工作,即它会在例如一小时后终止工作。

无论如何,我认为它有时没有在最大分配时间内完成的原因是因为它被另一个会话 ID 阻止。如何查询 DMV 的查询文本并准确找出阻塞会话中的内容。

我有这个查询,我知道阻塞会话 ID 和我的会话 ID。

SELECT TOP 100 w.session_id, w.wait_duration_ms, w.blocking_session_id, w.wait_type, e.database_id, D.name
FROM sys.dm_os_waiting_tasks w
LEFT JOIN sys.dm_exec_sessions e ON w.session_id = e.session_id
LEFT JOIN sys.databases d ON e.database_id = d.database_id
where w.session_id = x and w.blocking_session_id = y
order by w.wait_duration_ms desc

如何获取阻塞会话 ID 的内容(例如 SP 的名称)?

4

1 回答 1

1

您可以下载并创建sp_whoisactive例程。它将为您提供有关当前情况的清晰详细信息。

例如,创建一个表:

DROP TABLE IF EXISTS dbo.TEST;

CREATE TABLE dbo.TEST
(
    [Column] INT 
);

在一个会话中执行以下代码:

BEGIN TRAN;

INSERT INTO dbo.TEST
SELECT 1

-- commit tran

然后在第二个:

SELECT *
FROM dbo.TEST;

第三个,执行例程:

EXEC sp_Whoisactive

它会给你类似下面的东西:

在此处输入图像描述

您可以清楚地看到SELECT被打开事务的会话阻止。

当例程返回特定时刻的活动时,您可能希望将详细信息记录在表格中并稍后进行分析。

如果您怀疑进程被阻塞或死锁受害者,创建仅收集这些事件的扩展事件会话会更合适。有很多例子说明这是如何完成的,而且很容易。这很好,因为您可以分析死锁图并更轻松地解决问题。

于 2020-10-13T06:23:13.600 回答