使用扩展事件捕获隐式转换

使用适当的数据类型以避免转换或隐式转换是良好的T-SQL编码实践的基本方法。隐式转换可能导致较差的性能。。但是,除了查看系统中的每个执行计划之外,是否有一种方法可以查看您是否正在经历隐式转换?事实上,是的,它就在那里的延伸事件。

影响计划转换

嵌入到扩展事件中的是一个捕获将影响执行计划的转换的事件。此事件将同时显示转换和转换_隐式警告,这些警告通常只会在执行计划中看到。您可以与其他人一起捕捉此事件。通过捕获事件以及因果关系跟踪,可以很容易地跟踪有此问题的查询。下面是一个例子,说明如何捕获隐式转换以及查询:

CREATE EVENT SESSION ImplicitConversion
ON SERVER
    ADD EVENT sqlserver.plan_affecting_convert
    (WHERE (sqlserver.database_name = N'AdventureWorks2017')),
    ADD EVENT sqlserver.sql_batch_completed
    (WHERE (sqlserver.database_name = N'AdventureWorks2017')),
    ADD EVENT sqlserver.sql_batch_starting
    (WHERE (sqlserver.database_name = N'AdventureWorks2017'))
    ADD TARGET package0.event_file
    (SET filename = N'C:\PerfData\ImplicitConversion.xel')
WITH (TRACK_CAUSALITY = ON);

这组事件将捕获批处理的开始和批处理的完成,以及plan_Impact_CONVERT事件。因为我将Track_因果关系设置为ON,所以可以确保将隐式转换与特定的查询关联起来。您可以轻松地修改它以处理语句或远程过程调用。

另一种方法是只捕获plan_Impact_Transform事件。然后使用操作(也称为全局字段)来获取查询。本课程将完成以下工作:

CREATE EVENT SESSION ImplicitConversionOnly
ON SERVER
    ADD EVENT sqlserver.plan_affecting_convert
    (ACTION (sqlserver.sql_text)
     WHERE (sqlserver.equal_i_sql_unicode_string(sqlserver.database_name, N'AdventureWorks2017')))
    ADD TARGET package0.event_file
    (SET filename = N'C:\PerfData\ImplicitConversionOnly.xel');

如果操作被过度使用,则可能会出现问题。此外,有些操作比其他操作的开销更大。但是,在这种情况下,它可能比添加因果关系跟踪的负载更小。

您可能仍然有在这些查询中包含转换或转换_隐式的查询,这些查询不会被此事件捕获。这是因为并非所有这样的转换都会导致计划中的问题。您可能还会看到错误的结果,在这种情况下,优化器会发出不影响性能的转换警告。

结语

正如您所看到的,通过扩展事件来处理哪些查询可能会因为隐式转换而遇到问题,实际上是非常容易的。实际上,您只能通过扩展事件捕获此信息。这种能力只是我强烈推荐使用扩展事件的另一个原因。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值