同步查询从 DMV 检索会话和锁

Pau*_*ams 2 sql-server t-sql dmv

我有一个 SQL 脚本,当我想查看数据库中发生的事情时运行该脚本。该脚本有许多从 DMV 返回信息的查询,但我最常用的两个是“请求”(sys.dm_exec_requestssys.dm_exec_sessions等)和“锁”(sys.dm_tran_locks)。输出类似于 SQL Server 活动监视器,但它显示更多信息。

有时,请求会出现在 Requests 查询中,但它会在 Locks 查询运行之前完成。例如,Requests 查询可能显示 SPID 51 正在等待锁定资源,但 Locks 查询不包含 SPID 51 的任何锁定信息。(我知道来自的wait_typewait_resourcesys.dm_exec_requests。)

有没有办法确保这两个单独的查询显示数据库活动的连贯快照?

我预计商业数据库监控应用程序一定会遇到同样的问题。

我已经尝试在 SERIALIZABLE 并发中运行这些查询并向 DMV 连接添加锁定提示,但查询未获取锁定。无论如何,我不想在生产中这样做。

到目前为止,我最好的想法是:

  1. 从不同的会话同时运行这些查询。

  2. 在一个查询中加入请求和锁。考虑到我一次看到超过 100,000 个锁,这个连接会返回很多重复的请求和会话数据,但它可能会起作用。

我对扩展事件不够熟悉,不知道它们是否会更好地工作——也许是事件配对?

Rem*_*anu 6

不可能。这些 DMV 甚至不提供自我一致性保证。例如,在同一次运行中,在同一个结果集中,资源可能出现在不同的互斥状态。如果这样的 DMV 在扫描期间采取必要的步骤来“稳定”数据,那么结果对性能来说将是灾难性的(想象一下,在扫描sys.dm_tran_locks过程中所有的锁都被冻结在原地)。

扩展事件确实提供了更好的画面,但显然是事件的画面,而不是状态的画面。理论上总是可以从知道初始状态的事件序列中重建状态,并获得从状态转储(DMV)中获得的相同图片,但这只是理论上......