操作系统是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. oracle数据库当前用户下所有表名和表名的注释

    select a.TABLE_NAME,b.COMMENTSfrom user_tables a,user_tab_comments bWHERE a.TABLE_NAME=b.TABLE_NAMEo ...

  2. Drawable新属性

    mSelectEndorseReasonTv.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.toup, 0);新属性替换: Draw ...

  3. 数据结构 - 静态单链表的实行(C语言)

    静态单链表的实现 1 静态链表定义 静态链表存储结构的定义如下: /* 线性表的静态链表存储结构 */ #define MAXSIZE 1000 /* 假设链表的最大长度是1000 */ typede ...

  4. _bzoj2038 [2009国家集训队]小Z的袜子(hose)【莫队】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2038 裸的莫队,注意要先移动右端点再移动左端点. #include <cstdio&g ...

  5. LoadRunner_11破解教程完整版

    2017.12.17更正 qtm的LR11,如果是win10版本的电脑而且ie浏览器是11以上的请到loadrunner官网下载社区免费版,支持google,firefox,edge,ie11四大浏览 ...

  6. STL之map基础知识

    Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候 ...

  7. 转 Dockerfile 常用指令 - 每天5分钟玩转 Docker 容器技术(16)

    是时候系统学习 Dockerfile 了. 下面列出了 Dockerfile 中最常用的指令,完整列表和说明可参看官方文档. FROM指定 base 镜像. MAINTAINER设置镜像的作者,可以是 ...

  8. WAMP配置虚拟目录

    1.启动wamp所有服务,输入localhost或localhost:端口号确保wamp环境正常无误. 2.设置httpd.conf 2.1打开文件:单击wamp在电脑右下角的图标=>wamp= ...

  9. Hadoop YARN学习之核心概念(2)

    Hadoop YARN学习之核心概念(2) 1. Hadoop 2.X YARN引入的新服务 1.1 新的ResourceManager纯碎作为资源调度器,是集群资源的唯一仲裁者: 1.2 用户应用程 ...

  10. axis2与eclipse的整合:开始一个简单的axis2 的demo

    1.下载axis2,现在axis2最新版本是axis2-1.6.2,下载地址:http://axis.apache.org/axis2/java/core/download.cgi 2.下载好的zip ...