技术开发 频道

SQL Server用扩展事件进行高级故障排除

  第三个注意事项是如何处理事件丢失。在定义扩展事件会话时,可指定事件是否可以“丢失”。这意味着如果没有足够的内存来缓冲某个事件,则可将其直接丢弃。默认设置是允许丢弃单个事件,但也可以允许整个事件缓冲区都丢失(适用于事件缓冲区很快就被填满的会话),甚至还可以指定任何事件都不得丢失。

  使用最后一个选项时应格外注意,因为它会强制触发事件的代码一直等待,直到有足够的缓冲区内存来存储该事件为止。设置此选项几乎肯定会对性能产生不利影响。请注意,如果无意间启用了此选项,服务器仍会拥有足够的响应能力让您能够禁用此设置。

  通常,您需要通盘考虑这些选项。实际上我并没有办法为您提供通用的非常好的方法,我能做的只是向您强调深入领会它们,否则您可能会遇到性能问题。有关这些设置的详细信息,请参阅“CREATE EVENT SESSION (T-SQL)”。

  事件的寿命

  定义并启动扩展事件会话后,处理过程将照常进行,直到所监控的代码遇到某个事件为止。图 4 介绍了扩展事件系统所遵循的步骤。具体步骤如下:

  1.执行检查以查看是否有任何扩展事件会话正在监控该事件。如果没有,控制权将返给包含该事件的代码,然后继续进行处理。

  2.确定事件的负载,将所需的全部信息都收集到内存中 — 换言之,构建事件的负载。

  3.如果为该事件定义了任何谓词,则执行它们。此时,谓词结果可能是不应消耗该事件。如果是这种情况,控制权将返给包含该事件的代码,然后继续进行处理。

  4.此时系统已得知事件将被消耗,因此将执行链接到该事件的所有动作。现在事件已具有完整的负载,已为消耗做好准备。

  5.将事件提供给同步目标(如果有的话)。

  6.如果存在任何异步目标,将会缓冲该事件以便随后进行处理。

  7.控制权将返给包含该事件的代码,然后继续进行处理。

1

  图 4“扩展事件”事件的寿命(单击图像可查看大图)

  如前所述,在创建事件会话时应格外注意,要避免同步动作或异步目标的缓冲对所监控代码的性能产生影响。

  使用扩展事件

  SQL Server 2008 联机丛书中包括两个扩展事件的使用示例:“如何:确定哪些查询持有锁”和“如何:查找具有最多锁定的对象。”

  我将通过一个对扩展事件会话进行设置和对结果进行分析的示例对此加以讲解。当我在 2007 年年末使用扩展事件时,我发现把简单的会话组装起来非常容易(直接使用 T-SQL DDL 语句即可),但对结果进行分析却比较麻烦。

  这些结果均以 XML 形式表示,最初这令我很吃惊,但随后我意识到面对可能被收集到单个会话中的大量可能的事件和动作的组合,要想存储此类可扩展架构,可能再也没有比这更可行的选择了。  

点击查看更多TechNet精彩文章

0
相关文章