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

SQL Server中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 ServerSELECT @utilizedCpuCount = COUNT( * )FROM sys.dm_os_schedulersWHERE status = 'VISIBLE ONLINE'--calculate the CPU usage by queries OVER a 5 sec intervalSELECT @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_offsetWHEN -1 THEN DATALENGTH(st.TEXT)ELSE r.statement_end_offsetEND - 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_countFROM sys.dm_exec_connections cJOIN sys.dm_exec_sessions s ON c.session_id= s.session_idJOIN 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 != @@SPIDORDER 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_msFROM sys.dm_exec_query_stats qsCROSS APPLY sys.dm_exec_sql_text(sql_handle) stORDER 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 executionsSELECTqs_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_encryptedFROM(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_cpuCROSS APPLY sys.dm_exec_sql_text(plan_handle) AS qJOIN master.dbo.sysdatabases d on q.dbid=d.dbidCROSS APPLY sys.dm_exec_query_plan(plan_handle) pWHERE p.query_plan.exist('declare namespaceqplan = "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 NULLAND 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 migINNER JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handleINNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handleWHERE CONVERT (DECIMAL (28, 1),migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans)) > 10ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC

http://www.lryc.cn/news/419634.html

相关文章:

  • AUTOSAR AP常用文档前缀
  • 服务器迁移基于Tomcat部署的java应用,没有源码怎么办?
  • kafka-go使用:以及kafka一些基本概念说明
  • 景联文科技:破解数据标注行业痛点,引领高质量AI数据服务
  • C#获取Network的相关信息
  • Jenkins 部署Vue项目指引: Vue项目本地跨域代理 、解决ERR_UNSAFE_PORT
  • C语言电子画板
  • Android Gradle开发与应用技术原理
  • Midjourney入门-提示词基础撰写与公式
  • Apache Tomcat服务器版本号隐藏
  • 【Qt】Qt编程注意事项
  • 在Linux系统安装Kafka
  • 【CSharp】简单定义一个异步方法
  • 贪心算法之货仓选址问题
  • Java网络编程——Request Response 对象
  • 【代码随想录训练营第42期 Day24打卡 回溯Part3 - LeetCode 93.复原IP地址 78.子集 90.子集II
  • python venv和virtualenv详解
  • 《征服数据结构》树堆(Treap)
  • 论文笔记:OneBit: Towards Extremely Low-bit Large Language Models
  • 英语文化中的音乐分类及其发展历史(Classical、Jazz、Rock、Pop、Electronic、Country、RB、Hip-Hop)
  • C语言-栈、队列、二叉树
  • pinia-plugin-persistedstate 插件不生效
  • sqlite 合并两个数据库中的特定表
  • winform中设置DateTimePicker参数为空
  • Python爬虫(8)
  • 靓图!多点创新!CEEMDAN-Kmeans-VMD-CNN-LSTM-Attention双重分解+卷积长短期+注意力多元时间序列预测
  • zdpgo_gin_limit 为zdpgo_gin打造的接口限流框架,当API接口需要限制访问频率的时候可以使用此框架
  • Java1234的Vue学习笔记
  • 嵌入式八股-C++面试91题(20240809)
  • 如何恢复误删视频?找回误删视频文件的办法分享