问题描述
最近客户提出让排查前两天sqlserver服务器cpu较高问题,让其分析原因,请问有什么sql 或者方法进行分析嘛?
如果没有分析历史方法,有什么推荐内容,抓取以后在可能出现类似的问题 可以捕获嘛?
专家解答
下面的查询显示 CPU 平均占用率最高的前 50 个 SQL 语句。
SELECT TOP 50 total_worker_time/execution_count AS [Avg CPU Time], (SELECT SUBSTRING(text,statement_start_offset/2,(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 Time] DESC
先从SQL角度查看有没有高消耗SQL出现
参考查询方法如下:
SELECT spid , blocked , DB_NAME(sp.dbid) AS DBName , waitresource , sp.waittime 等待毫秒 , sp.stmt_start , lastwaittype , sp.hostname , ( SELECT TOP 1 c.client_net_address FROM sys.dm_exec_requests r WITH ( NOLOCK ) RIGHT OUTER JOIN sys.dm_exec_sessions s WITH ( NOLOCK ) ON r.session_id = s.session_id RIGHT OUTER JOIN sys.dm_exec_connections c WITH ( NOLOCK ) ON s.session_id = c.session_id WHERE s.host_name = sp.hostname ) IP , A.[text] AS [TextData] , program_name , sp.loginame , sp.status , SUBSTRING(A.text, sp.stmt_start / 2, ( CASE WHEN sp.stmt_end = -1 THEN DATALENGTH(A.text) ELSE sp.stmt_end END - sp.stmt_start ) / 2) AS [current_cmd] FROM sys.sysprocesses AS sp OUTER APPLY sys.dm_exec_sql_text(sp.sql_handle) AS A WHERE spid > 50 --and lastwaittype='HADR_SYNC_COMMIT' AND status <> 'sleeping' ORDER BY sp.waittime DESC;
最后修改时间:2019-04-14 14:36:57
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。