SQL Server中查询CPU占用高的SQL语句

SQL Server中查询CPU占用高的情况,会用到sys.sysprocesses ,dm_exec_sessions ,dm_exec_requests

一、查看当前的数据库用户连接有多少

USE master

GO

SELECT * FROM sys.[sysprocesses] WHERE [spid]>50 --AND DB_NAME([dbid])='gposdb'

SELECT COUNT(*) FROM [sys].[dm_exec_sessions] WHERE [session_id]>50

二、选取前10个最耗CPU时间的会话

 
SQL 代码   复制

SELECT TOP 10

[session_id],

[request_id],

[start_time] AS '开始时间',

[status] AS '状态',

[command] AS '命令',

dest.[text] AS 'sql语句', 

DB_NAME([database_id]) AS '数据库名',

[blocking_session_id] AS '正在阻塞其他会话的会话ID',

[wait_type] AS '等待资源类型',

[wait_time] AS '等待时间',

[wait_resource] AS '等待的资源',

[reads] AS '物理读次数',

[writes] AS '写次数',

[logical_reads] AS '逻辑读次数',

[row_count] AS '返回结果行数'

FROM sys.[dm_exec_requests] AS der 

CROSS APPLY 

sys.[dm_exec_sql_text](der.[sql_handle]) AS dest 

WHERE [session_id]>50 AND DB_NAME(der.[database_id])='gposdb'  

ORDER BY [cpu_time] DESC

三、查询前10个最耗CPU时间的SQL语句

 
SQL 代码   复制

--在SSMS里选择以文本格式显示结果

SELECT TOP 10 

dest.[text] AS 'sql语句'

FROM sys.[dm_exec_requests] AS der 

CROSS APPLY 

sys.[dm_exec_sql_text](der.[sql_handle]) AS dest 

WHERE [session_id]>50  

ORDER BY [cpu_time] DESC

四、查询会话中有多少个worker在等待 

 
SQL 代码   复制

SELECT TOP 10

 [session_id],

 [request_id],

 [start_time] AS '开始时间',

 [status] AS '状态',

 [command] AS '命令',

 dest.[text] AS 'sql语句', 

 DB_NAME([database_id]) AS '数据库名',

 [blocking_session_id] AS '正在阻塞其他会话的会话ID',

 der.[wait_type] AS '等待资源类型',

 [wait_time] AS '等待时间',

 [wait_resource] AS '等待的资源',

 [dows].[waiting_tasks_count] AS '当前正在进行等待的任务数',

 [reads] AS '物理读次数',

 [writes] AS '写次数',

 [logical_reads] AS '逻辑读次数',

 [row_count] AS '返回结果行数'

 FROM sys.[dm_exec_requests] AS der 

 INNER JOIN [sys].[dm_os_wait_stats] AS dows 

 ON der.[wait_type]=[dows].[wait_type]

 CROSS APPLY 

 sys.[dm_exec_sql_text](der.[sql_handle]) AS dest 

 WHERE [session_id]>50  

 ORDER BY [cpu_time] DESC

五、查询CPU占用高的语句

 
SQL 代码   复制

SELECT TOP 10

   total_worker_time/execution_count AS avg_cpu_cost, plan_handle,

 

   execution_count,

 

   (SELECT SUBSTRING(text, statement_start_offset/2 + 1,

 

      (CASE WHEN statement_end_offset = -1

 

         THEN LEN(CONVERT(nvarchar(max), text)) * 2

 

         ELSE statement_end_offset

 

      END - statement_start_offset)/2)

 

   FROM sys.dm_exec_sql_text(sql_handle)) AS query_text

 

FROM sys.dm_exec_query_stats

 

ORDER BY [avg_cpu_cost] DESC
原文地址:https://www.cnblogs.com/xingvskong11/p/5446967.html