sys.dm_exec_query_stats (Transact-SQL)

适用于:yesSQL Server(所有支持的版本)YesAzure SQL 数据库YesAzure SQL 托管实例

返回SQL Server中缓存查询计划的聚合性能统计信息。 缓存计划中的每个查询语句在该视图中对应一行,并且行的生存期与计划本身相关联。 在从缓存删除计划时,也将从该视图中删除对应行。

备注

  • sys.dm_exec_query_stats的结果可能因每次执行而有所不同,因为数据仅反映已完成的查询,而不是仍在进行中的查询。
  • 若要从 Azure Synapse Analytics 或 Analytics Platform System (PDW) 中的专用SQL池调用此功能,请使用名称sys.dm_pdw_nodes_exec_query_stats。 对于无服务器SQL池,请使用sys.dm_exec_query_stats
列名称 数据类型 说明
sql_handle varbinary(64) 是唯一标识查询所属的批处理或存储过程的令牌。

通过调用 sys.dm_exec_sql_text 动态管理函数,sql_handle 可以和 statement_start_offsetstatement_end_offset 一起用于检索查询的 SQL 文本。
statement_start_offset int 指示行所说明的查询在其批查询或持久化对象文本中的开始位置(以字节为单位,从 0 开始)。
statement_end_offset int 指示行所说明的查询在其批查询或持久化对象文本中的结束位置(以字节为单位,从 0 开始)。 对于 2014 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 此计划在一次执行期间收到的最小保留内存授予量。 查询内存优化表始终为 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 此计划在一次执行期间使用过的最小已用内存授予量。 查询内存优化表始终为 0。

适用于:SQL Server 2016 (13.x) 及更高版本。
max_used_grant_kb bigint 此计划在一次执行期间使用的最大已用内存授予量。 查询内存优化表始终为 0。

适用于:SQL Server 2016 (13.x) 及更高版本。
total_ideal_grant_kb bigint 此计划估计自编译以来,此计划的理想内存授予总量。 查询内存优化表始终为 0。

适用于:SQL Server 2016 (13.x) 及更高版本。
last_ideal_grant_kb bigint 上次执行此计划时,以 KB 为单位的理想内存授予量。 查询内存优化表始终为 0。

适用于:SQL Server 2016 (13.x) 及更高版本。
min_ideal_grant_kb bigint 此计划在一次执行期间估计的最低理想内存授予量。 查询内存优化表始终为 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。

适用于:从 2016 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 和 SQL 托管实例,需要 VIEW SERVER STATE 权限。

在 SQL 数据库“基本”、“S0”和“S1”服务目标中,对于“弹性池”中的数据库,服务器管理员帐户、Azure Active Directory 管理员帐户或##MS_ServerStateReader##服务器角色中的成员身份是必需的。 对于所有其他 SQL 数据库服务目标,需要数据库的 VIEW DATABASE STATE 权限或 ##MS_ServerStateReader## 服务器角色中的成员身份。

备注

查询完成后,将更新该视图中的统计信息。

示例

A. 查找 TOP N 查询

下列示例返回了按平均 CPU 时间排名的前五个查询的信息。 此示例将根据查询的查询哈希对查询进行聚合,以便按照查询的累积资源消耗来分组在逻辑上等效的查询。

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 "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;  

另请参阅

与执行有关的动态管理视图和函数 (Transact-SQL)
sys.dm_exec_sql_text (Transact-SQL)
sys.dm_exec_query_plan (Transact-SQL)
sys.dm_exec_procedure_stats (Transact-SQL)
sys.dm_exec_trigger_stats (Transact-SQL)
sys.dm_exec_cached_plans (Transact-SQL)