说明:仅支持sql server2008及以上版本
declare @startTime datetime,@endTime datetime;
set @startTime='2020-10-14 00:00:00';
set @endTime='2020-10-15 00:00:00';SELECT TOP 1000 QS.creation_time,SUBSTRING(ST.text,(QS.statement_start_offset/2)+1,((CASE QS.statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE QS.statement_end_offset END - QS.statement_start_offset)/2) + 1) AS statement_text,ST.text,QS.total_worker_time,QS.last_worker_time,QS.max_worker_time,QS.min_worker_time
FROM sys.dm_exec_query_stats QS CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) ST WHERE QS.creation_time BETWEEN @startTime AND @endTime
--AND ST.text LIKE '%%'
ORDER BY QS.creation_time DESCSELECT TOP 1000 QS.creation_time,ST.text FROM
sys.dm_exec_query_stats QS CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) ST WHERE QS.creation_time BETWEEN @startTime AND @endTime
AND ST.text NOT LIKE 'select%'
ORDER BY QS.creation_time DESC
该视图sys.dm_exec_query_stats存放的就是当前所有执行计划的详细信息,比如某条执行计划共占CPU多少等等。因为该视图对编译次数、占用CPU资源总量、执行次数等都进行了详细的记录,所以,可以说是优化DB服务器CPU的一大利器。
关于CPU时间的单位,说明如下:
| 字段名 | 数据类型 | 描述 | 备注 |
| total_worker_time | bigint | 此计划自编译以来执行所用的 CPU 时间总量(以微秒为单位报告,但仅精确到毫秒)。 对于本机编译的存储过程,如果许多执行所用的时间都不到 1 毫秒,则 total_worker_time 可能不精确。 |
对于启用统计信息收集时的本机编译的存储过程, 以毫秒为单位收集工作线程时间。 如果查询执行的时间不到1毫秒, 则该值将为0。 |
| last_worker_time | bigint | 上次执行计划所用的 CPU 时间(以微秒为单位报告,但仅精确到毫秒)。 | |
| min_worker_time | bigint | 此计划在单次执行期间所用的最小 CPU 时间(以微秒为单位报告,但仅精确到毫秒)。 | |
| max_worker_time | bigint | 此计划在单次执行期间所用的最大 CPU 时间(以微秒为单位报告,但仅精确到毫秒)。 |