使用适当的数据类型以避免转换或隐式转换是良好的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:PerfDataImplicitConversion.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:PerfDataImplicitConversionOnly.xel');
如果操作被过度使用,则可能会出现问题。此外,有些操作比其他操作的开销更大。但是,在这种情况下,它可能比添加因果关系跟踪的负载更小。
您可能仍然有在这些查询中包含转换或转换_隐式的查询,这些查询不会被此事件捕获。这是因为并非所有这样的转换都会导致计划中的问题。您可能还会看到错误的结果,在这种情况下,优化器会发出不影响性能的转换警告。
结语
正如您所看到的,通过扩展事件来处理哪些查询可能会因为隐式转换而遇到问题,实际上是非常容易的。实际上,您只能通过扩展事件捕获此信息。这种能力只是我强烈推荐使用扩展事件的另一个原因。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
本例子用到了struts 2标签,可以很容易换成别的。 var pics=””; var links=””; var texts=””; pics+=”photo/${image}”; links+=”news!detail.do?id=${id}”; tex…