sys.dm_exec_query_stats (Transact-SQL)
适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例
返回 SQL Server 中缓存查询计划的聚合性能统计信息。 缓存计划中的每个查询语句在该视图中对应一行,并且行的生存期与计划本身相关联。 在从缓存删除计划时,也将从该视图中删除对应行。
sys.dm_exec_query_stats
的结果可能因每次执行而有所不同,因为数据仅反映已完成的查询,而不是仍在进行中的查询。
若要从 Azure Synapse Analytics 或 Analytics 平台系统(PDW)中的专用 SQL 池调用此 DMV,请使用名称 sys.dm_pdw_nodes_exec_query_stats
。 对于无服务器 SQL 池,请使用 sys.dm_exec_query_stats
。
列名称 | 数据类型 | 描述 |
---|---|---|
sql_handle |
varbinary(64) | 唯一标识查询所属的批处理或存储过程的令牌。sql_handle ,以及 statement_start_offset 和 statement_end_offset ,可以通过调用 sys.dm_exec_sql_text 动态管理功能来检索查询的 SQL 文本。 |
statement_start_offset |
int | 指示行所说明的查询在其批查询或持久化对象文本中的开始位置(以字节为单位,从 0 开始)。 |
statement_end_offset |
int | 指示行所说明的查询在其批查询或持久化对象文本中的结束位置(以字节为单位,从 0 开始)。 对于 SQL Server 2014(12.x)之前的版本,值为 -1 表示批处理的结束。 不再包含尾随的注释。 |
plan_generation_num |
bigint | 可用于在重新编译后区分不同计划实例的序列号。 |
plan_handle |
varbinary(64) | 一个令牌,用于唯一标识已执行的批处理的查询执行计划及其计划驻留在计划缓存中,或当前正在执行。 此值可以传递给 sys.dm_exec_query_plan 动态管理功能以获取查询计划。 当本机编译的存储过程查询内存优化表时,始终 0x000 。 |
creation_time |
datetime | 编译计划的时间。 当前时区中记录时间。 |
last_execution_time |
datetime | 上次开始执行计划的时间。 当前时区中记录时间。 |
execution_count |
bigint | 计划自上次编译以来所执行的次数。 |
total_worker_time |
bigint | 此计划自编译以来执行所用的 CPU 时间总量(以微秒为单位报告,但仅精确到毫秒)。 对于本机编译的存储过程,如果许多执行时间少于 1 毫秒,则 total_worker_time 可能不准确。 |
last_worker_time |
bigint | 上次执行计划所用的 CPU 时间(以微秒为单位报告,但仅精确到毫秒)。 1 |
min_worker_time |
bigint | 此计划在单次执行期间所用的最小 CPU 时间(以微秒为单位报告,但仅精确到毫秒)。 1 |
max_worker_time |
bigint | 此计划在单次执行期间所用的最大 CPU 时间(以微秒为单位报告,但仅精确到毫秒)。 1 |
total_physical_reads |
bigint | 此计划自编译后在执行期间所执行的物理读取总次数。 查询内存优化表时始终 0 。 |
last_physical_reads |
bigint | 上次执行计划时所执行的物理读取次数。 查询内存优化表时始终 0 。 |
min_physical_reads |
bigint | 此计划在单个执行期间所执行的最少物理读取次数。 查询内存优化表时始终 0 。 |
max_physical_reads |
bigint | 此计划在单个执行期间所执行的最多物理读取次数。 查询内存优化表时始终 0 。 |
total_logical_writes |
bigint | 此计划自编译后在执行期间所执行的逻辑写入总次数。 查询内存优化表时始终 0 。 |
last_logical_writes |
bigint | 在最近完成的计划执行期间,已脏的缓冲池页数。 读取页面后,页面仅在第一次修改时变得脏。 当页面变得脏时,此数字将递增。 对已脏页的后续修改不会影响此数字。 查询内存优化表时,始终 0 此数字。 |
min_logical_writes |
bigint | 此计划在单个执行期间所执行的最少逻辑写入次数。 查询内存优化表时始终 0 。 |
max_logical_writes |
bigint | 此计划在单个执行期间所执行的最多逻辑写入次数。 查询内存优化表时始终 0 。 |
total_logical_reads |
bigint | 此计划自编译后在执行期间所执行的逻辑读取总次数。 查询内存优化表时始终 0 。 |
last_logical_reads |
bigint | 上次执行计划时所执行的逻辑读取次数。 查询内存优化表时始终 0 。 |
min_logical_reads |
bigint | 此计划在单个执行期间所执行的最少逻辑读取次数。 查询内存优化表时始终 0 。 |
max_logical_reads |
bigint | 此计划在单个执行期间所执行的最多逻辑读取次数。 查询内存优化表时始终 0 。 |
total_clr_time |
bigint | 时间(以微秒为单位(但仅准确到毫秒),通过执行此计划,在 Microsoft .NET Framework 公共语言运行时 (CLR) 对象内使用,因为它已编译。 CLR 对象可以是存储过程、函数、触发器、类型和聚合。 |
last_clr_time |
bigint | 在上次执行此计划期间,在 .NET Framework CLR 对象内执行所消耗的时间(但仅准确到毫秒)。 CLR 对象可以是存储过程、函数、触发器、类型和聚合。 |
min_clr_time |
bigint | 在单个执行期间,此计划在 .NET Framework CLR 对象内已消耗的最小时间(但仅准确到毫秒)。 CLR 对象可以是存储过程、函数、触发器、类型和聚合。 |
max_clr_time |
bigint | 最长时间(以微秒为单位(但仅准确到毫秒)报告,此计划在单个执行期间在 .NET Framework CLR 中曾经使用过。 CLR 对象可以是存储过程、函数、触发器、类型和聚合。 |
total_elapsed_time |
bigint | 上次完成执行此计划所用的总时间(以微秒为单位报告,但仅精确到毫秒)。 |
last_elapsed_time |
bigint | 最近一次完成执行此计划所用的时间(以微秒为单位报告,但仅精确到毫秒)。 |
min_elapsed_time |
bigint | 任何一次完成执行此计划所用的最小时间(以微秒为单位报告,但仅精确到毫秒)。 |
max_elapsed_time |
bigint | 任何一次完成执行此计划所用的最大时间(以微秒为单位报告,但仅精确到毫秒)。 |
query_hash |
二进制(8) | 对查询计算的二进制哈希值,用于标识具有类似逻辑的查询。 可以使用查询哈希确定仅仅是文字值不同的查询的聚合资源使用情况。 |
query_plan_hash |
binary(8) | 对查询执行计划计算的二进制哈希值,用于标识类似的查询执行计划。 可以使用查询计划哈希查找具有类似执行计划的查询的累积成本。 当本机编译的存储过程查询内存优化表时,始终 0x000 。 |
total_rows |
bigint | 查询返回的总行数。 不能为 null。 当本机编译的存储过程查询内存优化表时,始终 0 。 |
last_rows |
bigint | 上一次执行查询返回的行数。 不能为 null。 当本机编译的存储过程查询内存优化表时,始终 0 。 |
min_rows |
bigint | 一次执行期间查询返回的最小行数。 不能为 null。 当本机编译的存储过程查询内存优化表时,始终 0 。 |
max_rows |
bigint | 一次执行期间查询返回的最大行数。 不能为 null。 当本机编译的存储过程查询内存优化表时,始终 0 。 |
statement_sql_handle |
varbinary(64) |
适用于:SQL Server 2014 (12.x) 及更高版本。 仅当打开查询存储并收集该特定查询的统计信息时,才使用非 NULL 值填充。 |
statement_context_id |
bigint |
适用于:SQL Server 2014 (12.x) 及更高版本。 仅当打开查询存储并收集该特定查询的统计信息时,才使用非 NULL 值填充。 |
total_dop |
bigint | 此计划自编译以来使用的并行度的总和。 始终 0 查询内存优化表。适用于:SQL Server 2016(13.x)及更高版本。 |
last_dop |
bigint | 上次执行此计划的并行度。 始终 0 查询内存优化表。适用于:SQL Server 2016(13.x)及更高版本。 |
min_dop |
bigint | 此计划在一次执行期间使用的最小并行度。 始终 0 查询内存优化表。适用于:SQL Server 2016(13.x)及更高版本。 |
max_dop |
bigint | 此计划在一次执行期间使用的最大并行度。 始终 0 查询内存优化表。适用于:SQL Server 2016(13.x)及更高版本。 |
total_grant_kb |
bigint | 此计划自编译以来收到的 KB 中的保留内存授予总量。 始终 0 查询内存优化表。适用于:SQL Server 2016(13.x)及更高版本。 |
last_grant_kb |
bigint | 上次执行此计划时,以 KB 为单位的保留内存授予量。 始终 0 查询内存优化表。适用于:SQL Server 2016(13.x)及更高版本。 |
min_grant_kb |
bigint | 此计划在一次执行期间收到的最小保留内存授予量(以 KB 为单位)。 始终 0 查询内存优化表。适用于:SQL Server 2016(13.x)及更高版本。 |
max_grant_kb |
bigint | 此计划在一次执行期间收到的最大保留内存授予量。 始终 0 查询内存优化表。适用于:SQL Server 2016(13.x)及更高版本。 |
total_used_grant_kb |
bigint | 此计划自编译以来使用的 KB 中的保留内存授予总量。 始终 0 查询内存优化表。适用于:SQL Server 2016(13.x)及更高版本。 |
last_used_grant_kb |
bigint | 上次执行此计划时,已用内存授予量(以 KB 为单位)。 始终 0 查询内存优化表。适用于:SQL Server 2016(13.x)及更高版本。 |
min_used_grant_kb |
bigint | 此计划在一次执行期间使用的最小内存授予量(以 KB 为单位)。 始终 0 查询内存优化表。适用于:SQL Server 2016(13.x)及更高版本。 |
max_used_grant_kb |
bigint | 此计划在一次执行期间使用的最大已用内存授予量(以 KB 为单位)。 始终 0 查询内存优化表。适用于:SQL Server 2016(13.x)及更高版本。 |
total_ideal_grant_kb |
bigint | 此计划自编译以来估计的理想内存授予总量(以 KB 为单位)。 始终 0 查询内存优化表。适用于:SQL Server 2016(13.x)及更高版本。 |
last_ideal_grant_kb |
bigint | 上次执行此计划时,以 KB 为单位的理想内存授予量。 始终 0 查询内存优化表。适用于:SQL Server 2016(13.x)及更高版本。 |
min_ideal_grant_kb |
bigint | 此计划在一次执行期间估计的理想内存授予量(以 KB 为单位)。 始终 0 查询内存优化表。适用于:SQL Server 2016(13.x)及更高版本。 |
max_ideal_grant_kb |
bigint | 此计划在一次执行期间估计的最大理想内存授予量。 始终 0 查询内存优化表。适用于:SQL Server 2016(13.x)及更高版本。 |
total_reserved_threads |
bigint | 此计划自编译以来使用的保留并行线程总数。 始终 0 查询内存优化表。适用于:SQL Server 2016(13.x)及更高版本。 |
last_reserved_threads |
bigint | 上次执行此计划时保留的并行线程数。 始终 0 查询内存优化表。适用于:SQL Server 2016(13.x)及更高版本。 |
min_reserved_threads |
bigint | 此计划在一次执行期间使用的最小保留并行线程数。 始终 0 查询内存优化表。适用于:SQL Server 2016(13.x)及更高版本。 |
max_reserved_threads |
bigint | 此计划在一次执行期间使用的最大保留并行线程数。 始终 0 查询内存优化表。适用于:SQL Server 2016(13.x)及更高版本。 |
total_used_threads |
bigint | 此计划自编译以来使用的并行线程总数。 始终 0 查询内存优化表。适用于:SQL Server 2016(13.x)及更高版本。 |
last_used_threads |
bigint | 上次执行此计划时使用的并行线程数。 始终 0 查询内存优化表。适用于:SQL Server 2016(13.x)及更高版本。 |
min_used_threads |
bigint | 此计划在一次执行期间使用的最小并行线程数。 始终 0 查询内存优化表。适用于:SQL Server 2016(13.x)及更高版本。 |
max_used_threads |
bigint | 此计划在一次执行期间使用的最大并行线程数。 始终 0 查询内存优化表。适用于:SQL Server 2016(13.x)及更高版本。 |
total_columnstore_segment_reads |
bigint | 查询读取的列存储段的总和。 不能为 null。 适用于:从 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 开始 |
last_columnstore_segment_reads |
bigint | 最后一次执行查询所读取的列存储段数。 不能为 null。 适用于:从 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 开始 |
min_columnstore_segment_reads |
bigint | 一次执行期间查询读取的列存储段的最小数量。 不能为 null。 适用于:从 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 开始 |
max_columnstore_segment_reads |
bigint | 一次执行期间查询读取的最大列存储段数。 不能为 null。 适用于:从 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 开始 |
total_columnstore_segment_skips |
bigint | 查询跳过的列存储段的总和。 不能为 null。 适用于:从 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 开始 |
last_columnstore_segment_skips |
bigint | 上次执行查询时跳过的列存储段数。 不能为 null。 适用于:从 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 开始 |
min_columnstore_segment_skips |
bigint | 在一次执行期间查询跳过的最小列存储段数。 不能为 null。 适用于:从 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 开始 |
max_columnstore_segment_skips |
bigint | 一次执行期间查询跳过的最大列存储段数。 不能为 null。 适用于:从 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 开始 |
total_spills |
bigint | 自编译以来,此查询的执行溢出的总页数。 适用于:从 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 开始 |
last_spills |
bigint | 上次执行查询时溢出的页数。 适用于:从 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 开始 |
min_spills |
bigint | 此查询在单个执行期间溢出的最小页数。 适用于:从 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 开始 |
max_spills |
bigint | 此查询在单个执行期间溢出的最大页数。 适用于:从 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 开始 |
pdw_node_id |
int | 此分发所在节点的标识符。 适用于:Azure Synapse Analytics、Analytics Platform System (PDW) |
total_page_server_reads |
bigint | 此计划的执行执行的远程页面服务器读取总数,因为它已编译。 适用范围:Azure SQL 数据库超大规模 |
last_page_server_reads |
bigint | 上次执行计划时执行的远程页面服务器读取次数。 适用于:Azure SQL 数据库“超大规模” |
min_page_server_reads |
bigint | 此计划在单个执行期间执行过的最小远程页面服务器读取次数。 适用于:Azure SQL 数据库“超大规模” |
max_page_server_reads |
bigint | 此计划在单个执行过程中执行的最大远程页面服务器读取次数。 适用于:Azure SQL 数据库“超大规模” |
注意
1 对于启用统计信息收集时本机编译的存储过程,将收集工作器时间(以毫秒为单位)。 如果查询以小于 1 毫秒为单位执行,则该值 0
。
权限
SQL Server 2019 (15.x) 和早期版本以及 Azure SQL 托管实例需要 VIEW SERVER STATE
权限。
SQL Server 2022 (16.x) 及更高版本需要对服务器具有 VIEW SERVER PERFORMANCE STATE
权限。
在 Azure SQL 数据库 基本、S0和 S1 服务目标上,对于 弹性池、服务器管理员 帐户、Microsoft entra 管理员 帐户或 ##MS_ServerStateReader##
服务器角色 的成员身份是必需的。 对于所有其他 SQL 数据库服务目标,需要数据库的 VIEW DATABASE STATE
权限或 ##MS_ServerStateReader##
服务器角色中的成员身份。
注解
查询完成后,将更新该视图中的统计信息。
示例
A. 查找 TOP N 查询
下列示例返回了按平均 CPU 时间排名的前五个查询的信息。 此示例将根据查询的查询哈希对查询进行聚合,以便按照查询的累积资源消耗来分组在逻辑上等效的查询。 Sample_Statement_Text列显示与查询哈希匹配的查询结构示例,但不应考虑语句中的特定值。 例如,如果语句包含 WHERE Id = 5
,则可以以更通用的形式读取它:WHERE Id = @some_value
。
SELECT TOP 5
query_stats.query_hash AS Query_Hash,
SUM(query_stats.total_worker_time) / SUM(query_stats.execution_count) AS Avg_CPU_Time,
MIN(query_stats.statement_text) AS Sample_Statement_Text
FROM (
SELECT QS.*,
SUBSTRING(ST.text, (QS.statement_start_offset / 2) + 1, (
(
CASE statement_end_offset
WHEN - 1
THEN DATALENGTH(ST.text)
ELSE QS.statement_end_offset
END - QS.statement_start_offset
) / 2
) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS QS
CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) AS ST
) AS query_stats
GROUP BY query_stats.query_hash
ORDER BY 2 DESC;
B. 返回查询的行计数聚合
以下示例返回查询的行计数聚合信息(总行数、最小行数、最大行数和最后一行)。
SELECT qs.execution_count,
SUBSTRING(qt.text, qs.statement_start_offset / 2 + 1, (
CASE
WHEN qs.statement_end_offset = - 1
THEN LEN(CONVERT(NVARCHAR(max), qt.text)) * 2
ELSE qs.statement_end_offset
END - qs.statement_start_offset
) / 2) AS query_text,
qt.dbid,
dbname = DB_NAME(qt.dbid),
qt.objectid,
qs.total_rows,
qs.last_rows,
qs.min_rows,
qs.max_rows
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
WHERE qt.text LIKE '%SELECT%'
ORDER BY qs.execution_count DESC;