SqlServer 使用sys.dm_exec_query_stats查看开销较高的语句

本文介绍了一种使用SQL语句来统计和分析数据库执行计划的方法,包括查询CPU时间、执行次数、物理读取次数等关键指标,帮助理解数据库性能并进行优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL语句统计信息查询

SELECT TOP 10 total_worker_time / 1000 AS [自编译以来执行所用的CPU时间总量(ms)],
	   total_elapsed_time/1000 as [完成执行此计划所用的总时间],
	   total_elapsed_time / execution_count/1000 as [平均完成执行此计划所用时间],
       execution_count  as [上次编译以来所执行的次数],    
	   creation_time as [编译计划的时间],
       deqs.total_worker_time / deqs.execution_count / 1000 AS [平均使用CPU时间(ms)],
       last_execution_time AS [上次开始执行计划的时间],
	   total_physical_reads [编译后在执行期间所执行的物理读取总次数],
	   total_logical_reads/execution_count [平均逻辑读次数],
	   min_worker_time /1000 AS [单次执行期间所用的最小CPU时间(ms)],
       max_worker_time / 1000 AS [单次执行期间所用的最大 CPU 时间(ms)],
       SUBSTRING(dest.text, deqs.statement_start_offset / 2 + 1,          
	   (CASE
         WHEN deqs.statement_end_offset = -1 THEN
          DATALENGTH(dest.text)          
         ELSE deqs.statement_end_offset
       END - deqs.statement_start_offset
	   ) / 2 + 1) AS [执行SQL], 
       dest.text as [完整SQL],
       db_name(dest.dbid) as [数据库名称],
       object_name(dest.objectid, dest.dbid) as [对象名称]
	   ,deqs.plan_handle [查询所属的已编译计划]
  FROM sys.dm_exec_query_stats deqs WITH(NOLOCK)
 CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest

 --平均使用CPU时间降序
 ORDER BY (deqs.total_worker_time / deqs.execution_count / 1000) DESC
 --执行时间降序
 --ORDER BY total_elapsed_time / execution_count DESC;

平均使用CPU时间降序
在这里插入图片描述
执行时间降序
在这里插入图片描述
查看执行计划

select * from sys.dm_exec_query_plan(0x05000A0045E84551103903112400000001000000000000000000000000000000000000000000000000000000)

在这里插入图片描述

<think>嗯,用户问的是SQL Server查询CPU消耗的问题。首先,我需要确定用户的需求是什么。他们可能遇到了性能问题,想找出哪些查询消耗了最多的CPU资源,或者想优化数据库性能。接下来,我应该考虑如何收集和分析CPU使用情况的数据。 首先,想到的是系统视图,比如sys.dm_exec_query_stats,这个动态管理视图可以获取缓存的查询计划及其执行统计信息。里面包含了CPU时间的信息,total_worker_time字段应该有用。但要注意,这个视图只保留已缓存的查询,可能不包含当前正在执行的查询。 然后,用户可能需要实时监控,这时候可以用sys.dm_exec_requests,它会显示当前正在执行的请求,包括CPU时间。不过,可能还需要结合其他视图,比如sys.dm_exec_sql_text来获取具体的SQL文本。 另外,用户可能不知道如何将这些信息关联起来,比如如何将plan_handle转换成SQL语句。需要解释清楚如何使用CROSS APPLY sys.dm_exec_sql_text来获取查询文本。 还有,可能要考虑平均CPU消耗和总消耗的区别。有些查询可能单次消耗不高,但执行次数多,总体影响大。这时候需要按总CPU排序,或者按平均排序,根据情况选择。 用户可能还需要知道如何识别问题查询后该怎么做。比如,分析执行计划,检查是否有缺失的索引,或者查询是否写得不高效,比如不必要的复杂性、隐式转换等。 此外,提到SQL Server内置报告,比如活动监视器或者标准报表,可能对用户有帮助,特别是那些不太熟悉DMV的用户,图形界面更友好。 还要注意权限问题,访问这些DMV需要定的权限,比如VIEW SERVER STATE,可能需要提醒用户确认权限是否足够。 最后,应该总结步骤:识别高CPU查询、分析执行计划、优化查询或索引。可能还需要建议定期监控,因为CPU问题可能随着数据量增长而再次出现。</think>在SQL Server中分析查询的CPU消耗时,可以按照以下步骤进行排查和优化: 1. **实时监控CPU使用情况** ```sql SELECT session_id, start_time, status, command, sql_handle, cpu_time, total_elapsed_time, reads, writes, logical_reads FROM sys.dm_exec_requests WHERE status = 'running' ORDER BY cpu_time DESC; ``` 2. **历史查询分析** ```sql SELECT TOP 20 qs.total_worker_time/1000 AS [总CPU时间(ms)], qs.execution_count, qs.total_worker_time/qs.execution_count/1000 AS [平均CPU时间(ms)], 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 [查询语句], qt.text AS [完整批处理], qp.query_plan FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp ORDER BY qs.total_worker_time DESC; ``` 3. **关键字段说明** - `total_worker_time`: 累计CPU时间(微秒) - `execution_count`: 执行次数 - `sql_handle`: 用于获取SQL文本的标识符 - `query_plan`: 执行计划XML 4. **常见高CPU消耗原因** - 缺失索引导致表扫描 - 统计信息过期 - 参数嗅探问题 - 复杂查询(如大量计算、正则表达式) - 隐式类型转换 - 过度并行执行 5. **优化建议** - 使用`SET STATISTICS TIME ON`分析单次执行成本 - 检查执行计划中的警告标志 - 更新统计信息:`UPDATE STATISTICS <表名>` - 添加缺失索引(注意权衡写入开销) - 考虑查询重构或数据归档 6. **系统级监控工具** - 性能监视器(PerfMon)计数器: - `% Processor Time` - `SQL Statistics: Batch Requests/sec` - `SQL Server:SQL Statistics:SQL Compilations/sec` 建议定期运行高CPU查询分析,并建立性能基线。对于突发性CPU高峰,可结合`sys.dm_os_wait_stats`分析等待类型,综合判断性能瓶颈。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值