首页 > 数据库 >SQL Server中CPU使用率过高的排查

SQL Server中CPU使用率过高的排查

时间:2023-05-05 11:34:58浏览次数:32  
标签:sys qs SQL Server migs cpu time total CPU

CPU使用率过高有许多可能原因,但以下原因最为常见:

1.由于以下情况,表或索引扫描导致的高逻辑读取:
·过期统计信息
·缺少索引
·参数敏感计划 (PSP) 问题
·设计不佳的查询
2.工作负荷增加

对于安装了sqlserver的服务器,可以先看下任务管理器中sqlserver对cpu的占用情况,确定是否是sqlserver导致cpu消耗过高。


如果sqlserver进程导致CPU使用率过高,则最常见的原因是执行表或索引扫描的查询,其次是排序、哈希操作和循环 (嵌套循环运算符或 WHILE (T-SQL) ) 。

查询sqlserver当前在总CPU使用率中的占比:

DECLARE @init_sum_cpu_time int,
        @utilizedCpuCount int 
--get CPU count used by SQL Server
SELECT @utilizedCpuCount = COUNT( * )
FROM sys.dm_os_schedulers
WHERE status = 'VISIBLE ONLINE' 
--calculate the CPU usage by queries OVER a 5 sec interval 
SELECT @init_sum_cpu_time = SUM(cpu_time)
FROM sys.dm_exec_requests WAITFOR DELAY '00:00:05'SELECT CONVERT(DECIMAL(5,
         2),
         ((SUM(cpu_time) - @init_sum_cpu_time) / (@utilizedCpuCount * 5000.00)) * 100) AS [CPU FROM Queries AS Percent of Total CPU Capacity]
FROM sys.dm_exec_requests

查看当前占用CPU高的查询:

SELECT TOP 100 s.session_id,
           r.status,
           r.cpu_time,
           r.logical_reads,
           r.reads,
           r.writes,
           r.total_elapsed_time / (1000 * 60) 'Elaps M',
           SUBSTRING(st.TEXT, (r.statement_start_offset / 2) + 1,
           ((CASE r.statement_end_offset
                WHEN -1 THEN DATALENGTH(st.TEXT)
                ELSE r.statement_end_offset
            END - r.statement_start_offset) / 2) + 1) AS statement_text,
           COALESCE(QUOTENAME(DB_NAME(st.dbid)) + N'.' + QUOTENAME(OBJECT_SCHEMA_NAME(st.objectid, st.dbid)) 
           + N'.' + QUOTENAME(OBJECT_NAME(st.objectid, st.dbid)), '') AS command_text,
           r.command,
           s.login_name,
           s.host_name,
		   c.client_net_address,
           s.program_name,
           s.last_request_end_time,
           s.login_time,
           r.open_transaction_count
FROM sys.dm_exec_connections c
JOIN sys.dm_exec_sessions s ON c.session_id= s.session_id 
JOIN sys.dm_exec_requests r ON r.session_id = s.session_id CROSS APPLY sys.Dm_exec_sql_text(r.sql_handle) AS st
-- WHERE r.session_id != @@SPID
ORDER BY r.cpu_time DESC

查找历史当前占用CPU高的查询:

SELECT TOP 100 st.text AS batch_text,
    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,
	qs.execution_count,
	qs.total_worker_time,
	qs.last_execution_time,
    (qs.total_worker_time / 1000) / qs.execution_count AS avg_cpu_time_ms,
    (qs.total_elapsed_time / 1000) / qs.execution_count AS avg_elapsed_time_ms,
    qs.total_logical_reads / qs.execution_count AS avg_logical_reads,
    (qs.total_worker_time / 1000) AS cumulative_cpu_time_all_executions_ms,
    (qs.total_elapsed_time / 1000) AS cumulative_elapsed_time_all_executions_ms
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(sql_handle) st
ORDER BY(qs.total_worker_time / qs.execution_count) DESC

查询识别导致CPU使用率高且在查询计划中至少包含一个缺失索引的查询:

-- Captures the Total CPU time spent by a query along with the query plan and total executions
SELECT
    qs_cpu.total_worker_time / 1000 AS total_cpu_time_ms,
    q.[text],
    p.query_plan,
    qs_cpu.execution_count,
    q.dbid,
	d.name,
    q.objectid,
    q.encrypted AS text_encrypted
FROM
    (SELECT TOP 500 qs.plan_handle,
     qs.total_worker_time,
     qs.execution_count FROM sys.dm_exec_query_stats qs ORDER BY qs.total_worker_time DESC) AS qs_cpu
CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS q 
JOIN master.dbo.sysdatabases d on q.dbid=d.dbid
CROSS APPLY sys.dm_exec_query_plan(plan_handle) p
WHERE p.query_plan.exist('declare namespace 
        qplan = "http://schemas.microsoft.com/sqlserver/2004/07/showplan";
        //qplan:MissingIndexes')=1

使用以下查询检查是否缺少索引,并应用具有高改进度量值的任何建议索引。
从输出中具有最高improvement_measure值的前5或10条建议开始。这些索引对性能有最显著的积极影响。

SELECT CONVERT(VARCHAR(30), GETDATE(), 126) AS runtime,
    mig.index_group_handle,
    mid.index_handle,
    CONVERT(DECIMAL(28, 1), migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans)) AS improvement_measure,
    'CREATE INDEX missing_index_' + CONVERT(VARCHAR, mig.index_group_handle) + '_' + CONVERT(VARCHAR, mid.index_handle) + ' ON ' + mid.statement + ' (' + ISNULL(mid.equality_columns,
        '') + CASE WHEN mid.equality_columns IS NOT NULL
AND mid.inequality_columns IS NOT NULL THEN ','
ELSE ''
END + ISNULL(mid.inequality_columns,
        '') + ')' + ISNULL(' INCLUDE (' + mid.included_columns + ')',
        '') AS create_index_statement,
    migs.*,
    mid.database_id,
    mid.[object_id]
FROM sys.dm_db_missing_index_groups mig
INNER JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
WHERE CONVERT (DECIMAL (28, 1),
               migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans)) > 10
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC


https://learn.microsoft.com/zh-cn/troubleshoot/sql/database-engine/performance/troubleshoot-high-cpu-usage-issues

标签:sys,qs,SQL,Server,migs,cpu,time,total,CPU
From: https://www.cnblogs.com/abclife/p/17373644.html

相关文章

  • JDK导致ActiveMQ、Kafka连接zookeeper失败:Session 0x0 for server 10.1.21.244/<unres
      最近在部署一套ActiveMQ集群时,使用zookeeper来实现,zookeeper启动了,在启动ActiveMQ时,抛出异常:    WARN|Session0x0forserver10.1.21.244/<unresolved>:2181,unexpectederror,closingsocketconnectionandattemptingreconnectjava.lang.IllegalArgu......
  • 23、MySQL压力测试及mysql如何在生产中配置主配置文件
    MySQL压力测试及mysql如何在生产中配置主配置文件测试工具mysqlslap跟上选项#mysql自带mysqlslap-a-uroot-p123456#单线程测试mysqlslap-a-c100-uroot-p123456#多线程并发测试(模拟100个客户端并发连接)mysqlslap-a--concurrency=50,100--number-o......
  • 基于SqlSugar的开发框架循序渐进介绍(29)-- 快速构建系统参数管理界面-Vue3+ElementPlus
    在随笔《基于SqlSugar的开发框架循序渐进介绍(28)--快速构建系统参数管理界面》中介绍了基于SqlSugar开发框架,构建系统参数管理的后端API部分,以及WInform界面部分内容,本篇随笔介绍基于Vue3+ElementPlus的前端界面开发过程。1、Winform端界面的回顾系统参数的信息,设计为包含一个大......
  • sqlserver 查询表中的主键、外键列及外键表,外表中的主键列
    --获取主键信息EXECsp_pkeys@table_name='tablename'--获取外键方法一SELECTField=(SELECTnameFROMsyscolumnsWHEREcolid=b.fkeyANDid=b.fkeyid),FKTable=object_name(b.rkeyid),FKKeyField=(SELECTnameFROMsyscolumnsWHEREcolid=b.rkeyANDid=b.rkeyid......
  • Access 数据库迁移到 SQL Server/无升迁向导的Access怎么升迁到SQL Server
    HI,手机边亲爱的你还好吗?今天,我们给大家分享一个Access升迁到SQLServer的操作。Access数据库的大小限制为2GB,不能支持超过255个并发用户。因此,当Access数据库可以转到下一级别时,可以迁移到SQLServer。 SQLServer(无论是在本地还是Azure云中)都支持大量数据、更多的......
  • mysql event事件
    检查事件调度程序SHOWVARIABLESLIKE'event_scheduler';#如果返回值为ON,则表示事件调度程序已启用。如果返回值为OFF,则需要使用以下命令启用SETGLOBALevent_scheduler=ON;查询事件SHOWEVENTS;查看事件定义SHOWCREATEEVENTevent_name;创建事件CRE......
  • mysql TRIGGER 触发器
    确定触发器的触发事件,可以是INSERT、UPDATE或DELETE操作。确定触发器的执行时间,可以是BEFORE(前)或AFTER(后)。确定触发器要绑定的表名和触发事件(即INSERT、UPDATE或DELETE)。编写触发器的触发操作,可以是任何合法的SQL语句。使用CREATETRIGGER语句创建触发器,指定触......
  • 酷比魔方iwork8超级版平板(z3735f的cpu)安装linux
    这类平板都是15年左右的老机器,性能放到现在可谓十分孱弱,装windows已经不能流畅运行,而且不知为何,按照官方提供的镜像刷机后,过一段时间系统就会损坏,遂考虑安装Linux系统,经过一番搜索,发现了这些平板最大的问题:其带的UEFI(传统BIOS的替代品)是32位的,然而现在大多数系统都是6......
  • ubuntu18.04 安装docker、mysql、nacos
    一、安装docker1.更新软件源列表sudoapt-getupdate2.安装软件包依赖sudoaptinstallapt-transport-httpsca-certificatescurlsoftware-properties-common3.在系统中添加Docker的官方密钥curl-fsSLhttps://download.docker.com/linux/ubuntu/gpg|sudoapt-ke......
  • not-perf cpu采样profiler工具
    not-perf类似perf,但是实现了cpu无关,可以开箱即用支持的特性支持多种cpu架构支持离线以及在线stacktrace展开支持不带debuginfo的分析支持跨架构数据分析架构无关的数据费事内置火焰图参考使用支持的命令nperf-core0.1.1JanBujak<[email protected]> ......