查询执行期间获取的锁数

Ben*_*ual 2 sql-server sql-server-2012 locking

我在 SSMS 中执行一条语句,例如:

select Ident 
from PART_Stamm 
where VerketteterArtikelID = 'D9FA5CEC-E3C5-11E6-B088-F079596E5F58'
Run Code Online (Sandbox Code Playgroud)

在那里我可以显示执行计划。这完美地工作。现在我还需要显示PART_Stamm在执行上述查询期间在表上获取的锁数。我怎样才能得到这些信息?

Sea*_*ser 5

这是扩展事件的完美使用。

-- replace Session_id with your spid
CREATE EVENT SESSION [Specific_Locks] ON SERVER 
ADD EVENT sqlserver.lock_acquired(
    WHERE ([sqlserver].[session_id]=(55))),
ADD EVENT sqlserver.lock_escalation(
    WHERE ([sqlserver].[session_id]=(55))),
ADD EVENT sqlserver.lock_released(
    WHERE ([sqlserver].[session_id]=(55))),
ADD EVENT sqlserver.lock_timeout_greater_than_0(
    WHERE ([sqlserver].[session_id]=(55)))
ADD TARGET package0.event_file(SET filename=N'Specific_Locks',max_file_size=(100))
GO

ALTER EVENT SESSION [Specific_Locks] ON SERVER STATE=START
GO

-- run your query

ALTER EVENT SESSION [Specific_Locks] ON SERVER STATE=STOP
GO
Run Code Online (Sandbox Code Playgroud)

这将为您提供会话所做的一切,但是,您可以过滤表和索引的对象 ID,以使其更具可读性。我包括了获取、释放、超时和升级,因为我不了解您的环境。

如果要查看捕获的数据,有两种内置方式,无需使用外部程序。

  1. 使用sys.fn_xe_file_target_read_file()并提供适当的参数
  2. 用SMSS为你打开文件目标,给你半懂显示(下图)

Where to find XE target view data