扩展事件、sp_reset_connection 和 sql_text

jim*_*jim 3 sql-server

我在 3 台不同的服务器上运行了扩展的事件会话。我正在寻找长时间运行或过度调用的存储过程和内联查询(ORM,主要是 nHibernate)。

rpc_completed event_name 的输出显示 object_type 和 statements_text 的“sp_reset_connection”。但是,它还有一个在 sql_text 中捕获的查询。

扩展事件是否将 2 个执行 --sp_reset_connection 和查询 -- 作为单个事件捕获?我是否应该查看 sp_reset_connection 加上 sql_text 或 statements_text 中的查询的总时间的持续时间值?或者,它是否捕获 sp_reset_connection 并仅显示触发 sp_reset_connection 的查询?

我期望 sp_reset_connection 和查询是单独的事件。

澄清:为什么扩展事件会返回字段之间的冲突?

1. object_name = 'sp_reset_connection'
2. statement = 'exec sp_reset_connection'
3. sql_text = a query (ex: '(@p0 int)SELECT specificat0_.ScenarioId ...')
Run Code Online (Sandbox Code Playgroud)

为什么 sql_text 不同?在典型的扩展事件行 (XML) 中,3 个字段对于已执行的内容是一致的。这给我留下了一个问题:“什么被处决了?”。是否应将持续时间字段值分配给 sp_reset_connection?或者在sql_text中找到内联sql?或两者?

我了解 sp_reset_connection 是什么以及它是如何工作的。我不明白的是扩展事件是如何报告的。Profiler 在报告 sp_reset_connection 时没有歧义。

我的结论是扩展事件正在返回 sp_reset_connection 的结果。然而,这是基于我观察到的结论——即猜测。我需要更具体的东西:即使只有其他人得出相同的结论。

这篇文章表明我可以忽略sql_text。

https://www.sqlskills.com/blogs/jonathan/understanding-the-sql_text-action-in-extended-events/

感谢您的帮助。

Cha*_*ace 5

我将这样说作为序言sp_reset_connection不是你通常需要担心的事情。它不是作为完整的 RPC 调用执行的,它只是 TDS 数据包中的单个位标志,并且执行速度非常快。

此外,XEvents 和 Profiler 以 的形式呈现它以及正常的 RPC 存储过程调用exec SomeProc @param1...,但这并不是实际执行的。它只是这样的调用在作为 T-SQL 批处理执行时可能是什么样子的文本表示。相反,RPC 调用使用特定的 TDS 机制,该机制仅传递SomeProc,并单独传递参数。

鉴于此,并从我自己的测试来看,我认为这里发生的情况是 XEvents 显示每个过程调用,以及对sp_reset_connection,即使它们来自同一个 RPC 调用。

因此,对于带有参数的临时批处理,您会得到sql_text = '(@param1 ...)SELECT whatever',因为这是已触发的调用sp_reset_connection(尽管在测试中我没有得到此详细信息)。正如您的链接文章中提到的,这个值确实应该被称为input_buffer它真正代表的值。

同时,statement = 'exec sp_reset_connection'因为这就是等效的 T-SQL可能的样子(您实际上不能直接在 T-SQL 中调用它,尽管您可以使用普通的 RPC 调用,例如通过 SqlClient)。

被调用的实际对象存储在object_name = 'sp_reset_connection'. 如果您想知道存储过程是否被调用,或者是否sp_executesql被调用(用于临时),这就是您应该关注的内容。并且您应该向 XEvent 添加一个过滤器以删除sp_reset_connection

....
  ADD EVENT sqlserver.rpc_completed(
    ACTION(sqlserver.sql_text)
    WHERE (object_name <> 'sp_reset_connection')
  )
Run Code Online (Sandbox Code Playgroud)

为了证明我的观点,即有两个事件被触发,并且在 中显示输入批处理sql_text,请参阅以下从 .Net 的 SqlClient 发送的参数化临时批处理的屏幕截图

重置事件

和这个:

主要活动