如何使用Microsoft SQL Server扩展事件查看SET选项排查慢查询问题
扩展事件完全支持捕获查询执行时对应的SET选项配置,以下是具体实现方案及你场景下的排查补充:
方案1:捕获连接建立时的全量SET选项
连接建立时触发的existing_connection_established事件会默认携带连接的SET配置,你可以通过以下扩展事件会话捕获:
CREATE EVENT SESSION [Capture_Connection_Set_Options] ON SERVER ADD EVENT sqlserver.existing_connection_established( ACTION( sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.session_id, sqlserver.set_options, sqlserver.set_options_text -- SQL Server 2016及以上版本支持,直接返回可读的SET选项文本 ) WHERE client_app_name = N'你的.NET应用名称' -- 可过滤仅捕获目标应用的连接 ) ADD TARGET package0.event_file(SET filename=N'Capture_Connection_Set_Options.xel') GO
捕获到的set_options_text字段会直接返回ANSI_NULLS=ON, ANSI_PADDING=ON, ARITHABORT=OFF...格式的可读文本,无需手动解析位图。
方案2:关联查询计划与对应SET选项
如果需要和捕获的查询计划一一绑定,可以在查询计划事件上添加SET选项相关的动作:
CREATE EVENT SESSION [Capture_Plan_With_Set_Options] ON SERVER ADD EVENT sqlserver.query_post_execution_showplan( -- 捕获实际执行计划 ACTION( sqlserver.session_id, sqlserver.sql_text, sqlserver.set_options, sqlserver.set_options_text ) WHERE sqlserver.database_name = N'你的第二个数据库名称' -- 过滤慢查询所在的数据库 ) ADD TARGET package0.event_file(SET filename=N'Capture_Plan_With_Set_Options.xel') GO
启动会话后触发慢查询操作,即可在捕获的事件中同时看到执行计划和对应的SET选项,直接和SSMS执行时的SET选项对比,即可确认是否是配置差异导致的执行效率差异。
本地快速验证方案
如果只是临时验证第二个SqlConnection的SET配置,可以直接在代码中添加诊断逻辑,无需配置扩展事件:
在connection.Open();之后插入以下代码,直接输出当前连接的SET选项:
// 新增诊断代码 var checkCmd = new SqlCommand("DBCC USEROPTIONS", connection); var optionReader = checkCmd.ExecuteReader(); while (optionReader.Read()) { Console.WriteLine($"{optionReader["Set Option"]}: {optionReader["Value"]}"); } optionReader.Close(); // 原业务代码继续执行 SqlDataReader reader = command.ExecuteReader();
常见会导致执行计划不匹配的SET选项包括ARITHABORT、ANSI_NULLS、ANSI_PADDING、QUOTED_IDENTIFIER、CONCAT_NULL_YIELDS_NULL,优先对比这几个配置即可。
内容的提问来源于stack exchange,提问作者bumlutedru
相关产品推荐
相关产品推荐

