适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Microsoft Fabric 中的 SQL 数据库
SQL Server 数据库引擎提供对查询执行计划的运行时信息的访问权限。 出现性能问题时,最重要的操作之一是准确了解正在执行的工作负载以及如何驱动使用资源。 因此,访问 实际执行计划 非常重要。
虽然查询完成是实际查询计划可用性的先决条件,但实时查询统计信息可以提供对查询执行过程的实时见解,因为数据是从一个查询计划运算符移动到另一个。 实时查询计划显示总体查询进度和操作员级运行时执行统计信息(例如处理的行数、运行时间、操作员进度等)。由于此数据是实时可用的,无需等待完成查询,因此这些执行统计信息对于调试查询性能问题非常有用,例如长时间运行查询以及无限期运行而从未完成过的查询。
标准查询执行统计信息分析基础结构
必须启用 查询执行统计信息配置文件基础结构或标准分析来收集有关执行计划的信息,即行计数、CPU 和 I/O 使用情况。 以下收集 目标会话 的执行计划信息的方法使用标准分析基础结构:
Note
在 SQL Server Management Studio 中单击“包括实时查询统计信息”按钮会使用标准分析基础结构。 在 SQL Server 的较新版本中,如果启用了 轻量级分析基础结构,那么在通过 Activity Monitor 查看实时查询统计信息或直接查询 sys.dm_exec_query_profiles DMV 时,将使用该基础结构,而不是标准分析。
为所有 会话 全局收集执行计划信息的以下方法使用标准分析基础结构:
-
query_post_execution_showplan扩展事件。 若要启用扩展事件,请参阅 使用扩展事件监视系统活动。 - SQL Trace 和 SQL Server Profiler 中的 Showplan XML 跟踪事件。 有关此跟踪事件的详细信息,请参阅 Showplan XML 事件类。
运行使用该 query_post_execution_showplan 事件的扩展事件会话时,还会填充 sys.dm_exec_query_profiles DMV,从而为所有会话启用实时查询统计信息,使用 活动监视器 或直接查询 DMV。 有关详细信息,请参阅 Live Query Statistics。
轻型查询执行统计信息分析基础结构
从 SQL Server 2014 (12.x) SP2 和 SQL Server 2016 (13.x) 开始,引入了新的轻型查询执行统计信息基础结构或轻型分析。
Note
轻量级分析不支持本机编译的存储过程。
轻量级查询执行统计信息分析基础设施 v1
适用于:SQL Server 2014 (12.x) SP2 到 SQL Server 2016 (13.x)。
从 SQL Server 2014 (12.x) SP2 和 SQL Server 2016 (13.x) 开始,通过引入轻型分析,减少了收集执行计划信息的性能开销。 与标准分析不同,轻型分析不会收集 CPU 运行时信息。 但是,轻量级分析仍会收集行数和 I/O 使用信息。
还引入了一个新的 query_thread_profile 扩展事件,该事件使用轻型分析。 此扩展事件公开了每个运算符的执行统计信息,从而可以更深入地了解每个节点和线程的性能。 可以按照以下示例配置一个使用此扩展事件的示例会话:
CREATE EVENT SESSION [NodePerfStats] ON SERVER
ADD EVENT sqlserver.query_thread_profile
(
ACTION (sqlos.scheduler_id,
sqlserver.database_id,
sqlserver.is_system,
sqlserver.plan_handle,
sqlserver.query_hash_signed,
sqlserver.query_plan_hash_signed,
sqlserver.server_instance_name,
sqlserver.session_id,
sqlserver.session_nt_username,
sqlserver.sql_text)
)
ADD TARGET package0.ring_buffer (SET max_memory = (25600))
WITH
(
MAX_MEMORY = 4096 KB,
EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS,
MAX_DISPATCH_LATENCY = 30 SECONDS,
MAX_EVENT_SIZE = 0 KB,
MEMORY_PARTITION_MODE = NONE,
TRACK_CAUSALITY = OFF,
STARTUP_STATE = OFF
);
Note
有关查询分析的性能开销的详细信息,请参阅博客文章Developers Choice: Query progress - anytime, anywhere(开发人员选择:随时随地查询进度)。
运行使用 query_thread_profile 事件的扩展事件会话时,还会通过轻量分析填充 sys.dm_exec_query_profiles DMV,从而可通过 活动监视器 或直接查询该 DMV,为所有会话启用实时查询统计信息。
轻量级查询执行统计信息分析基础架构 v2
适用于:SQL Server 2016 (13.x) SP1 到 SQL Server 2017 (14.x)。
SQL Server 2016 (13.x) SP1 包含修订版的轻量级分析功能,且开销极低。 还可以使用 跟踪标志 7412 全局启用轻型分析,这适用于前面在 适用对象 中所述的版本。 新增了 DMF sys.dm_exec_query_statistics_xml,用于返回正在执行的请求的查询执行计划。
从 SQL Server 2016 (13.x) SP2 CU3 和 SQL Server 2017 (14.x) CU11 开始,如果未全局启用轻型分析,则可以使用新的 USE HINT 查询提示 参数 QUERY_PLAN_PROFILE 在任何会话的查询级别启用轻型分析。 当包含此新提示的查询完成时,还会输出新的 query_plan_profile 扩展事件,该事件提供与扩展事件类似的 query_post_execution_showplan 实际执行计划 XML。
Note
query_plan_profile扩展事件即使未使用查询提示,也会使用轻量分析。
可以使用 query_plan_profile 扩展事件的示例会话进行配置,如以下示例所示:
CREATE EVENT SESSION [PerfStats_LWP_Plan] ON SERVER
ADD EVENT sqlserver.query_plan_profile
(
ACTION (sqlos.scheduler_id,
sqlserver.database_id,
sqlserver.is_system,
sqlserver.plan_handle,
sqlserver.query_hash_signed,
sqlserver.query_plan_hash_signed,
sqlserver.server_instance_name,
sqlserver.session_id,
sqlserver.session_nt_username,
sqlserver.sql_text)
)
ADD TARGET package0.ring_buffer (SET max_memory = (25600))
WITH
(
MAX_MEMORY = 4096 KB,
EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS,
MAX_DISPATCH_LATENCY = 30 SECONDS,
MAX_EVENT_SIZE = 0 KB,
MEMORY_PARTITION_MODE = NONE,
TRACK_CAUSALITY = OFF,
STARTUP_STATE = OFF
);
轻型查询执行统计信息分析基础结构 v3
适用于:SQL Server 2019 (15.x) 及更高版本和 Azure SQL 数据库
SQL Server 2019 (15.x) 和 Azure SQL 数据库包括一个新修订的轻型分析版本,用于收集所有执行的行计数信息。 SQL Server 2019 (15.x) 和 Azure SQL 数据库上默认启用了轻型分析。 在 SQL Server 2019(15.x)及更高版本中,跟踪标志 7412 不起作用。 可以使用 LIGHTWEIGHT_QUERY_PROFILING数据库范围配置 在数据库级别禁用轻量级分析:ALTER DATABASE SCOPED CONFIGURATION SET LIGHTWEIGHT_QUERY_PROFILING = OFF;
引入了新的 DMF sys.dm_exec_query_plan_stats 以返回大多数查询的最后已知实际执行计划的等效项,称为“最后查询计划统计信息”。 可以在数据库级别使用LAST_QUERY_PLAN_STATS数据库范围配置启用最后一次查询计划统计信息:ALTER DATABASE SCOPED CONFIGURATION SET LAST_QUERY_PLAN_STATS = ON;
新的 query_post_execution_plan_profile 扩展事件基于轻量级分析收集相当于实际执行计划的等效信息,不同于使用标准分析的 query_post_execution_showplan。 SQL Server 2017 (14.x) 从 CU14 开始也提供此事件。 可以使用 query_post_execution_plan_profile 扩展事件的示例会话进行配置,如以下示例所示:
CREATE EVENT SESSION [PerfStats_LWP_All_Plans] ON SERVER
ADD EVENT sqlserver.query_post_execution_plan_profile
(
ACTION (sqlos.scheduler_id,
sqlserver.database_id,
sqlserver.is_system,
sqlserver.plan_handle,
sqlserver.query_hash_signed,
sqlserver.query_plan_hash_signed,
sqlserver.server_instance_name,
sqlserver.session_id,
sqlserver.session_nt_username,
sqlserver.sql_text)
)
ADD TARGET package0.ring_buffer (SET max_memory = (25600))
WITH
(
MAX_MEMORY = 4096 KB,
EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS,
MAX_DISPATCH_LATENCY = 30 SECONDS,
MAX_EVENT_SIZE = 0 KB,
MEMORY_PARTITION_MODE = NONE,
TRACK_CAUSALITY = OFF,
STARTUP_STATE = OFF
);
示例 1 - 使用标准分析的扩展事件会话
CREATE EVENT SESSION [QueryPlanOld] ON SERVER
ADD EVENT sqlserver.query_post_execution_showplan
(
ACTION (sqlos.task_time,
sqlserver.database_id,
sqlserver.database_name,
sqlserver.query_hash_signed,
sqlserver.query_plan_hash_signed,
sqlserver.sql_text)
)
ADD TARGET package0.event_file
(
SET filename = N'C:\Temp\QueryPlanStd.xel'
)
WITH
(
MAX_MEMORY = 4096 KB,
EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS,
MAX_DISPATCH_LATENCY = 30 SECONDS,
MAX_EVENT_SIZE = 0 KB,
MEMORY_PARTITION_MODE = NONE,
TRACK_CAUSALITY = OFF,
STARTUP_STATE = OFF
);
示例 2 - 使用轻量级性能分析的扩展事件会话
CREATE EVENT SESSION [QueryPlanLWP] ON SERVER
ADD EVENT sqlserver.query_post_execution_plan_profile
(
ACTION (sqlos.task_time,
sqlserver.database_id,
sqlserver.database_name,
sqlserver.query_hash_signed,
sqlserver.query_plan_hash_signed,
sqlserver.sql_text)
)
ADD TARGET package0.event_file
(
SET filename = N'C:\Temp\QueryPlanLWP.xel'
)
WITH
(
MAX_MEMORY = 4096 KB,
EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS,
MAX_DISPATCH_LATENCY = 30 SECONDS,
MAX_EVENT_SIZE = 0 KB,
MEMORY_PARTITION_MODE = NONE,
TRACK_CAUSALITY = OFF,
STARTUP_STATE = OFF
);
查询分析基础结构使用指南
下表总结了用于全局(在服务器级别)或在单个会话中启用标准分析或轻型分析的操作。 此外还包括支持该操作的最早版本。
| Scope | 标准性能分析 | 轻量级性能分析 |
|---|---|---|
| Global | 使用 query_post_execution_showplan XE 的扩展事件会话;从 SQL Server 2012 (11.x) 开始 |
跟踪标志 7412,从 SQL Server 2016(13.x)SP1 开始 |
| Global | 使用 Showplan XML 跟踪事件的 SQL Trace 和 SQL Server Profiler |
使用 query_thread_profile XE 的扩展事件会话;从 SQL Server 2014 (12.x) SP2 开始 |
| Global | N/A | 使用 query_post_execution_plan_profile XE 的扩展事件会话;从 SQL Server 2017 (14.x) CU14 和 SQL Server 2019 (15.x) 开始 |
| Session | 使用 SET STATISTICS XML ON |
将 QUERY_PLAN_PROFILE 查询提示与 XE 的扩展事件会话 query_plan_profile 结合使用;从 SQL Server 2016 (13.x) SP2 CU3 和 SQL Server 2017 (14.x) CU11 开始 |
| Session | 使用 SET STATISTICS PROFILE ON |
N/A |
| Session | 在 SSMS 中选择 “实时查询统计信息 ”按钮;从 SQL Server 2014 (12.x) SP2 开始 | N/A |
Remarks
Important
由于执行引用 sys.dm_exec_query_statistics_xml 的监控存储过程时可能出现随机访问冲突,请确保在 SQL Server 2016 (13.x) 和 SQL Server 2017 (14.x) 中安装 KB 4078596。
从轻型分析 v2 及其低开销开始,任何尚未受 CPU 绑定的服务器都可以 持续运行轻型分析,并允许数据库专业人员随时利用任何正在运行的执行,例如使用活动监视器或直接查询 sys.dm_exec_query_profiles,并获取具有运行时统计信息的查询计划。
有关查询分析的性能开销的详细信息,请参阅博客文章Developers Choice: Query progress - anytime, anywhere(开发人员选择:随时随地查询进度)。
采用轻量级分析的扩展事件会使用标准分析中的信息,前提是标准分析基础结构已启用。 例如,使用 query_post_execution_showplan 的扩展事件会话正在运行,而另一个使用 query_post_execution_plan_profile 的会话已启动。 第二个会话仍使用来自标准性能分析的信息。
Note
在 SQL Server 2017(14.x)上,轻型分析默认处于关闭状态,但在启动依赖扩展事件跟踪 query_post_execution_plan_profile 时激活,然后在停止跟踪时再次停用。 因此,如果在 SQL Server 2017 14.x 实例上频繁启动和停止基于query_post_execution_plan_profile的扩展事件跟踪,则应在全局级别启用轻型探查并使用跟踪标志 7412,以避免重复的激活/停用开销。