20

我正在尝试分析 SQL Server 2008 探查器中的死锁。我知道如何找到有问题的 sql 查询,但收集到的查询不包括参数值。

换句话说,我可以看到这样的东西:

DELETE FROM users WHERE id = @id

但我想看到的是:

DELETE FROM users WHERE id = 12345

我想我需要在分析器中收集一些额外的事件或列,但我不知道是哪个。我目前正在使用“TSQL_LOCKS”模板。

任何提示将不胜感激。

谢谢,

阿德里安

免责声明:我以前问过类似的问题,但我想它太具体了,这就是为什么我没有得到答复。我正在用这个开始另一次尝试。

4

4 回答 4

21

我认为您需要 RPC:Completed 事件:

http://msdn.microsoft.com/en-us/library/ms175543.aspx

于 2009-12-23T13:44:00.267 回答
6

Profiler 将包含RPC:Completed / RPC:Starting事件中的参数值。但是您已经收到回复告诉您这一点。

我想补充的是,为了分析死锁图,几乎不需要知道参数运行时值。首先,因为如果 'users' 涉及死锁,如果冲突发生在某个键上,死锁图本身就会泄露 @id 是什么冲突。其次,更重要的是,死锁场景与所涉及的确切键无关。不像是因为删除了 id 为 123 的用户而发生了死锁,但在删除用户 321 时不会发生死锁。

如果您决定首先询问 SO,我认为最好的办法是发布实际的死锁图并让社区看看。这里有很多可以仅从死锁图 XML 回答相当多的问题。

于 2009-12-23T16:25:21.903 回答
1

使用选中所有复选框的以下事件启动跟踪:

SQL: BatchCompleted
SQL: BatchStarting
Deadlock graph
Lock:Deadlock
Lock:Deadlock chain

死锁发生后,停止跟踪,然后点击死锁图事件类。

这应该让您对出了什么问题有一个很好的了解。

于 2009-12-23T14:16:26.413 回答
1

如果您使用的是存储过程(看起来像)或 Hibernate/NHibernate,您可能需要打开存储过程启动事件 (SP:StmtStarting) 和 RPC:Starting 事件。这将在查询后在其自己的行中显示参数。

就像是:

SP:StmtStarting DELETE FROM users WHERE id = @id

RPC:启动 exec sp_execute 12345

于 2009-12-23T15:21:11.997 回答