当前位置: 首页 > article >正文

sql Server服务区cpu占用率高,原因分析

查找高 CPU 查询

通过以下查询,可以找出占用 CPU 资源最多的查询:

sql
SELECT 
    SQLText.text AS QueryText,
    SQLStats.execution_count AS ExecutionCount,
    SQLStats.total_worker_time / 1000 AS TotalCPUTimeMS,
    SQLStats.total_worker_time / SQLStats.execution_count / 1000 AS AvgCPUTimeMS,
    SQLStats.total_elapsed_time / 1000 AS TotalElapsedTimeMS,
    SQLStats.total_elapsed_time / SQLStats.execution_count / 1000 AS AvgElapsedTimeMS
FROM 
    sys.dm_exec_query_stats SQLStats
    CROSS APPLY sys.dm_exec_sql_text(SQLStats.sql_handle) AS SQLText
ORDER BY 
    TotalCPUTimeMS DESC;

这会返回消耗 CPU 时间最多的查询。你可以根据查询的执行次数和 CPU 时间进一步分析

使用 DMVs 进行分析

使用动态管理视图 (DMVs) 获取更多关于 CPU 使用情况的详细信息。

sys.dm_exec_sessions:查看当前连接的会话。

SELECT     
    total_elapsed_time, 
	host_name,
	program_name,
    status, 
    login_name
	,*
FROM 
    sys.dm_exec_sessions 
WHERE 
    cpu_time > 1000  -- 调整这个阈值来寻找高 CPU 的会话
ORDER BY 
    cpu_time DESC

sys.dm_exec_requests:查看当前正在执行的请求。

SELECT 
    session_id,
    total_elapsed_time, 
    command, 
    status
	,*
FROM 
    sys.dm_exec_requests 
WHERE 
    cpu_time > 1000  -- 调整这个阈值来寻找高 CPU 的请求
ORDER BY 
    cpu_time DESC;

查看系统等待情况

如果 CPU 使用率高,可能会伴随有资源争用。通过查看等待类型,可以帮助你判断是否有锁、I/O 或其他资源争用的问题。

SELECT 
    SELECT 
    wait_type, 
    *
FROM 
    sys.dm_exec_requests
WHERE 
    wait_type <> 'NULL'
ORDER BY 
    wait_time DESC;

常见的高 CPU 相关等待类型包括:

CXPACKET:并行查询的等待类型,可能是并行查询的粒度设置过高,或者查询本身需要进行更多的并行操作。
LCK_M_:锁等待,表示查询在等待资源锁,可能有死锁或并发冲突。

分析执行计划

查看这些高 CPU 查询的 执行计划,分析是否存在性能瓶颈,如:

缺少索引或索引不合理
锁竞争或死锁
不良的查询逻辑
在查询中执行以下命令来获取执行计划:

SET STATISTICS XML ON;
-- 执行你怀疑高 CPU 的查询
SET STATISTICS XML OFF;

分析生成的执行计划,重点关注 CPU 密集型 操作,比如:

  1. Hash Join
  2. Sort
  3. Table Scans
  4. 索引查找

分析索引问题

索引不当可能导致查询性能差,从而导致 CPU 使用率过高。通过以下查询查看索引的使用情况:

SELECT 
    OBJECT_NAME(IXOS.OBJECT_ID) AS TableName,
    IX.name AS IndexName,
    IX.type_desc AS IndexType,
    SUM(IXOS.LEAF_INSERT_COUNT + IXOS.LEAF_UPDATE_COUNT + IXOS.LEAF_DELETE_COUNT) AS TotalOperations
FROM 
    SYS.DM_DB_INDEX_OPERATIONAL_STATS (NULL, NULL, NULL, NULL) AS IXOS
    INNER JOIN SYS.INDEXES AS IX ON IX.OBJECT_ID = IXOS.OBJECT_ID
GROUP BY 
    OBJECT_NAME(IXOS.OBJECT_ID), IX.name, IX.type_desc
ORDER BY 
    TotalOperations DESC;

如果有频繁的插入、更新或删除,可能需要优化索引。
检查是否存在过多的 索引碎片,这些可能影响查询性能,导致更高的 CPU 使用。
7. 检查 SQL Server 配置
确保 SQL Server 的配置适合当前硬件环境。例如,是否设置了适当的并行度。
如果在高并发场景下,可能需要调节 max degree of parallelism (MAXDOP) 配置。
可以使用以下命令检查当前的 MAXDOP 设置:

EXEC sp_configure 'max degree of parallelism';

如果这个值设置得过高,可能会导致某些查询消耗过多的 CPU 资源。

分析硬件和操作系统级别的瓶颈

如果 SQL Server 实例本身没有明显的问题,可能需要检查操作系统的 CPU 负载。可以通过 任务管理器 或 性能监视器 (PerfMon) 查看是否有其他进程占用 CPU 资源。

查看 SQL Server 错误日志

查看 SQL Server 错误日志,寻找是否有异常或资源瓶颈的相关日志,例如内存不足或其他警告信息。

优化查询

高 CPU 使用率经常是由于不优化的查询导致的。常见的优化方法包括:

使用合适的索引
避免全表扫描
优化查询的逻辑,避免不必要的复杂运算
考虑分解大型查询为多个小查询

总结

要分析 SQL Server CPU 使用率高的原因,可以通过以下几步进行详细调查:

使用活动监视器查看资源使用情况。
通过查询 sys.dm_exec_query_stats 找出高 CPU 查询。
分析查询的执行计划,查找性能瓶颈。
查看动态管理视图 (DMVs) 获取会话、请求和等待信息。
检查是否有锁争用或 I/O 阻塞。
检查索引和数据库的配置。
综合分析后,可以采取相应的措施,如优化查询、增加索引、调整并行度或优化硬件配置等,来降低 CPU 使用率。


http://www.kler.cn/a/504651.html

相关文章:

  • 神经网络
  • pycharm+pyside6+desinger实现查询汉字笔顺GIF动图
  • 【update 更新数据语法合集】.NET开源ORM框架 SqlSugar 系列
  • 【Rust自学】12.6. 使用TDD(测试驱动开发)开发库功能
  • Open FPV VTX开源之嵌入式OSD配置
  • MySQL的安装
  • 【基于轻量型架构的WEB开发】课程 实验一 mybatis操作 Java EE企业级应用开发教程 Spring+SpringMVC+MyBatis
  • Java爬虫——使用Spark进行数据清晰
  • UnityDots学习(二)
  • Vue computed属性原理及其惰性求值特点
  • ros2-6.4.4 两轮差速控制机器人(问题解决)
  • 集成学习算法
  • RabbitMQ确保消息可靠性
  • LSTM火灾温度预测(Pytorch版本)
  • 【JavaScript】基础内容,HTML如何引用JavaScript, JS 常用的数据类型
  • Ubuntu创建AndroidStudio快捷启动图标
  • HTML拖拽功能(纯html5+JS实现)
  • 极限竞速 地平线5“d3dx12_43.dll”文件丢失或错误导致游戏运行异常如何解决?windows系统DLL文件修复方法
  • 智汇云舟参编《城市轨道交通安全防范系统技术要求》国标正式发布
  • 【原创】大数据治理入门(2)《提升数据质量:质量评估与改进策略》入门必看 高赞实用
  • 面试之《new关键字》
  • python创建pdf水印,希望根据文本长度调整水印字体大小,避免超出页面
  • [Qt]常用控件介绍-输入类控件-QSpinBox、DateTimeEdit、Dial、Silder控件
  • C++笔记:打包独立运行的exe(在静态库中使用MFC)
  • 使用yarn命令创建Vue3项目
  • Microsoft Sql Server 2019 触发器