操作系统是Windows2008R2 ,数据库是SQL2014 64位。

  近阶段服务器出现过几次死机,管理员反馈机器内存使用率100%导致机器卡死。于是做了个监测服务器的软件实时记录CPU数据,几日观察得出数据如下:

  SQL优化方法:

  1、查看连接对象

1 USE master
2 GO
3 --如果要指定数据库就把注释去掉
4 SELECT * FROM sys.[sysprocesses] WHERE [spid]>50 --AND DB_NAME([dbid])='gposdb'

  

  当前连接对象有67个其中‘WINAME’的主机名,‘jTDS’的进程名不属于已知常用软件,找到这台主机并解决连接问题。在360流量防火墙中查看有哪个软件连接了服务器IP,除之。

2、然后使用下面语句看一下各项指标是否正常,是否有阻塞,正常情况下搜索结果应该为空。

 1 SELECT TOP 10
2 [session_id],
3 [request_id],
4 [start_time] AS '开始时间',
5 [status] AS '状态',
6 [command] AS '命令',
7 dest.[text] AS 'sql语句',
8 DB_NAME([database_id]) AS '数据库名',
9 [blocking_session_id] AS '正在阻塞其他会话的会话ID',
10 [wait_type] AS '等待资源类型',
11 [wait_time] AS '等待时间',
12 [wait_resource] AS '等待的资源',
13 [reads] AS '物理读次数',
14 [writes] AS '写次数',
15 [logical_reads] AS '逻辑读次数',
16 [row_count] AS '返回结果行数'
17 FROM sys.[dm_exec_requests] AS der
18 CROSS APPLY
19 sys.[dm_exec_sql_text](der.[sql_handle]) AS dest
20 WHERE [session_id]>50 AND DB_NAME(der.[database_id])='gposdb'
21 ORDER BY [cpu_time] DESC

查看是哪些SQL语句占用较大可以使用下面代码

1 --在SSMS里选择以文本格式显示结果
2 SELECT TOP 10
3 dest.[text] AS 'sql语句'
4 FROM sys.[dm_exec_requests] AS der
5 CROSS APPLY
6 sys.[dm_exec_sql_text](der.[sql_handle]) AS dest
7 WHERE [session_id]>50
8 ORDER BY [cpu_time] DESC

3、如果SQLSERVER存在要等待的资源,那么执行下面语句就会显示出会话中有多少个worker在等待

 1 SELECT TOP 10
2 [session_id],
3 [request_id],
4 [start_time] AS '开始时间',
5 [status] AS '状态',
6 [command] AS '命令',
7 dest.[text] AS 'sql语句',
8 DB_NAME([database_id]) AS '数据库名',
9 [blocking_session_id] AS '正在阻塞其他会话的会话ID',
10 der.[wait_type] AS '等待资源类型',
11 [wait_time] AS '等待时间',
12 [wait_resource] AS '等待的资源',
13 [dows].[waiting_tasks_count] AS '当前正在进行等待的任务数',
14 [reads] AS '物理读次数',
15 [writes] AS '写次数',
16 [logical_reads] AS '逻辑读次数',
17 [row_count] AS '返回结果行数'
18 FROM sys.[dm_exec_requests] AS der
19 INNER JOIN [sys].[dm_os_wait_stats] AS dows
20 ON der.[wait_type]=[dows].[wait_type]
21 CROSS APPLY
22 sys.[dm_exec_sql_text](der.[sql_handle]) AS dest
23 WHERE [session_id]>50
24 ORDER BY [cpu_time] DESC

4、查询CPU占用最高的SQL语句

 1 SELECT TOP 10
2 total_worker_time/execution_count AS avg_cpu_cost, plan_handle,
3 execution_count,
4 (SELECT SUBSTRING(text, statement_start_offset/2 + 1,
5 (CASE WHEN statement_end_offset = -1
6 THEN LEN(CONVERT(nvarchar(max), text)) * 2
7 ELSE statement_end_offset
8 END - statement_start_offset)/2)
9 FROM sys.dm_exec_sql_text(sql_handle)) AS query_text
10 FROM sys.dm_exec_query_stats
11 ORDER BY [avg_cpu_cost] DESC

5、索引缺失查询

 1 SELECT
2 DatabaseName = DB_NAME(database_id)
3 ,[Number Indexes Missing] = count(*)
4 FROM sys.dm_db_missing_index_details
5 GROUP BY DB_NAME(database_id)
6 ORDER BY 2 DESC;
7 SELECT TOP 10
8 [Total Cost] = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0)
9 , avg_user_impact
10 , TableName = statement
11 , [EqualityUsage] = equality_columns
12 , [InequalityUsage] = inequality_columns
13 , [Include Cloumns] = included_columns
14 FROM sys.dm_db_missing_index_groups g
15 INNER JOIN sys.dm_db_missing_index_group_stats s
16 ON s.group_handle = g.index_group_handle
17 INNER JOIN sys.dm_db_missing_index_details d
18 ON d.index_handle = g.index_handle
19 ORDER BY [Total Cost] DESC;

  找到索引缺失的表,根据查询结果中的关键次逐一建立索引。

  做完这些测试,基本能找到问题。

SQL SERVER占用CPU过高排查和优化的更多相关文章

  1. SQL Server 占用CPU较高的解决方法

    触发原因:月底系统结账的时候对ERP的操作较多,有用户反馈系统之间的数据传输很久没有同步.随即到服务器上查看,没有发现有程序导致的问题,看了一下CPU的使用率,发现SQL Server占用率在百分之九 ...

  2. SQL SERVER占用CPU过高优化

    操作系统是Windows2008R2 ,数据库是SQL2014 64位. 近阶段服务器出现过几次死机,管理员反馈机器内存使用率100%导致机器卡死.于是做了个监测服务器的软件实时记录CPU数据,几日观 ...

  3. SQL SERVER占用CPU过高优化S

    https://www.cnblogs.com/yuekong2010/p/6628001.html 然后使用下面语句看一下各项指标是否正常,是否有阻塞,正常情况下搜索结果应该为空. 1 SELECT ...

  4. 【SQL Server】SQL Server占用CPU使用率100%的解决方法

    原文:[SQL Server]SQL Server占用CPU使用率100%的解决方法 近日,帮一个客户解决了服务器CPU占用率高达100%的问题. 以前做的一个某污水处理厂自控系统项目,客户反映其自控 ...

  5. SQL Server 造成cpu 使用率高的 6 原因

    第一种: 编译和重编译执行计划. 第二种: 排序与聚合. 第三种: 表格连接操作. 第四种: max degree of parallelism. 第五种: max worker threads. 第 ...

  6. 查找linux下进程占用CPU过高的原因,以php-fpm为例

    很多时候,线上服务器的进程在某时间段内长时间占用CPU过高,为了优化,我们需要找出原因. 1.找出占用CPU最高的10个进程 ps aux | sort -k3nr | head -n 10 或查看占 ...

  7. SQL SERVER 占用资源高的SQL语句

    --SQL SERVER 占用资源高的SQL语句: --查询占用cpu高的前 50 个 SQL 语句 SELECT total_cpu_time,[total_physical_Reads], tot ...

  8. JVM进程占用CPU过高问题排查

    上午收到报警,某台机器上的CPU负载过高,通过逐步的排查,解决了问题,下面记录一下整个排查的过程. 首先,登录上对应的机器,通过top命令找到占用CPU过高的进程ID,也就是PID,为29126, 然 ...

  9. Linux排查Java程序占用CPU很高的解决办法

    Java的工具集相当强大,学习成本也很低,处理线上问题时,jstack这个工具就比微软的windbg,好学好用很多,3步找出占用CPU很高的源所在.而windbg反人类的各种命令,实在不敢恭维. 故意 ...

随机推荐

  1. python ftp小程序练习

    作业要求: 开发一个支持多用户在线的FTP程序 要求: 1.用户加密认证 2.允许同时多用户登陆 3.每个用户都有自己的家目录,并且只能访问自己的家目录 4.对用户进行磁盘配额,每个用户的可用空间不同 ...

  2. BP神经网络算法改进

    周志华机器学习BP改进 试设计一个算法,能通过动态调整学习率显著提升收敛速度,编程实现该算法,并选择两个UCI数据集与标准的BP算法进行实验比较. 1.方法设计 传统的BP算法改进主要有两类: - 启 ...

  3. FileStream和BinaryReader,BinaryWriter,StreamReader,StreamWriter的区别

    FileStream对于在文件系统上读取和写入文件非常有用,FileStream缓存输入和输出,以获得更好的性能.FileStream对象表示在磁盘或网络路径上指向文件的流.这个类提供了在文件中读写字 ...

  4. java中实参与形参的概念

    形参: public void fun(形参类型 形参名){ ... } 实参: public static void main(String[] args){ 类 对象名=new 类(); 对象名. ...

  5. 备份字段(CATALOGUE_CODE)

    update am_e4_entry set CATALOGUE_CODE_back=CATALOGUE_CODE; 还原字段 update am_e4_entry a set CATALOGUE_C ...

  6. 462 Minimum Moves to Equal Array Elements II 最少移动次数使数组元素相等 II

    给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1. 您可以假设数组的长度最多为10000.例如:输入:[1,2,3]输出:2说明:只有两个动作是必 ...

  7. 在linux环境下使用itext生成pdf

    转载请注明出处 https://www.cnblogs.com/majianming/p/9537173.html 项目中需要对订单生成pdf文件,在不断的尝试之后,终于生成了比较满意的pdf文档. ...

  8. 【开源】基于EF6+MVC5+API2+Easyui1.4.5+Easyui管理模板开发的管理系统

    经过近一步完善调整,现将本系统源码正式开放,定名为:EasyuiAdminFramework,另外EasyuiAdminTemplate及EasyuiFlatTheme也一并开源 项目主页:http: ...

  9. SSH---整合Struts2&Spring&Hibernate(实例)

    一.SSH回顾 Struts2:核心为过滤器+拦截器.过程:Filter--->FilterDispatcher-->ActionMapper-->ActionProxy--> ...

  10. Android IJKPlayer缓冲区设置以及播放一段时间出错解决方案

    IJKPlayer拖动播放进度会导致重新请求数据,未使用已经缓冲好的数据,所以应该尽量控制缓冲区大小,减少不必要的数据损失. mMediaPlayer.setOption(IjkMediaPlayer ...