SQLServer 常见高CPU利用率原因
1.缺失索引:
USE AdventureWorks2014SET STATISTICS TIME ON;SET STATISTICS IO ON ;SELECT per.FirstName,per.LastName,p.Name,p.ProductNumber,soh.OrderDate,sod.LineTotal,soh.TotalDueFROM sales.SalesOrderHeader AS sohINNER JOIN sales.SalesOrderDetail sod ON soh.SalesOrderID=sod.SalesOrderIDINNER JOIN Production.Product AS p ON sod.ProductID=p.ProductIDINNER JOIN sales.Customer AS c ON soh.CustomerID=c.CustomerIDINNER JOIN Person.Person AS per ON c.PersonID=per.BusinessEntityIDWHERE sod.LineTotal>25000SET STATISTICS IO OFF;SET STATISTICS TIME OFF;
得到下面的信息:
SQL Server 执行时间:CPU 时间 = 63 毫秒,占用时间 = 378 毫秒。SQL Server 执行时间:CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
--创建一个索引
CREATE NONCLUSTERED INDEX idx_SalesOrderDetail_LineTotal ON sales.SalesOrderDetail(LineTotal)
索引后结果如下:
SQL Server 执行时间:CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。SQL Server 执行时间:CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
2.统计信息过时
你明知道返回和处理的结果集都很小,而优化器却选择了hash连接,这是就可以检查一下图形化执行计划中是否有黄色叹号,或者用文本化执行计划看看预估和实际行数的差异是否很大。如果是使用UPDATE STATISTICS语句更新统计信息,同时检查为什么统计信息过时
3.非SARG查询
如果是一个谓词(特别是Where条件中)能用到索引查找操作,就可以理解为SARG,
如果在where 条件所用到的列中使用了标量函数(YEAR、UPPER)或使用like ‘%%’这类的查询,称为非SARG查询会导致索引无效
--非SARG(聚集索引扫描)SELECT soh.SalesOrderID,soh.OrderDate,soh.DueDate,soh.ShipDate,soh.Status,soh.SubTotal,soh.TaxAmt,soh.Freight,soh.TotalDueFROM sales.SalesOrderHeader AS sohINNER JOIN sales.SalesOrderDetail AS sodON soh.SalesOrderID=sod.SalesOrderID WHERE CONVERT(DATE,sod.ModifiedDate)='07/01/2005'
进行改写:(聚集索引查找)
SELECT soh.SalesOrderID,soh.OrderDate,soh.DueDate,soh.ShipDate,soh.Status,soh.SubTotal,soh.TaxAmt,soh.Freight,soh.TotalDueFROM sales.SalesOrderHeader AS sohINNER JOIN sales.SalesOrderDetail AS sodON soh.SalesOrderID=sod.SalesOrderID WHERE sod.ModifiedDate>='2005-07-01 00:00:00.000'AND sod.ModifiedDate<'2005-07-02 00:00:00.000'
非SARG对where条件中的列使用UPPER/LTRIM/ISNULL之类的标量函数,对于这种情况,改写查询解决。
4.隐式转换
指一个查询From/Where子句中,用于关联和判断列之间数据类型不同,导致优化器需要根据数据类型的优先级高低进行类型转换然后在优化、执行。
SELECT p.FirstName,p.LastName,c.AccountNumber FROM Sales.Customer AS c INNER JOIN Person.Person AS p ON c.PersonID =p.BusinessEntityIDWHERE c.AccountNumber=N'AW00029594'
如上图加宽部分就是需要把varchar类型转换成nvarchar类型。可以考虑在传入where条件之前先进行显式数据类型转换。
5.参数嗅探
创建针对存储过程、函数或者参数化查询的执行计划时,根据传入的参数进行预估并生成执行计划的一个功能,参数嗅探出现在执行计划的编译或者重编译过程中。
CREATE PROCEDURE user_GetCustomerShipDates(@ShipDateStart Datetime,@ShipDateEnd datetime)AS SELECT CustomerID,SalesOrderNumberFROM Sales.SalesOrderHeader WHERE ShipDate BETWEEN @ShipDateStart AND @ShipDateEnd--创建非聚集索引CREATE NONCLUSTERED INDEX IDX_ShipDate_ASCON Sales.SalesOrderHeader(ShipDate)--清空缓存DBCC FREEPROCCACHEEXEC user_GetCustomerShipDates '2005/07/08','2008/01/01'EXEC user_GetCustomerShipDates '2005/07/10','2008/07/20'--删除索引drop index IDX_ShipDate_ASC on Sales.SalesOrderHeader
在ShipDate上有索引,还是进行了聚集索引扫描。
在第一个存储过程的参数中,查询条件的时间范围几乎包括了全表的所有时间,另外非聚集索引没有覆盖查询,因此使用了聚集索引扫描
第二个存储过程仍然会用上面的执行计划。
把存储过程的顺序调换一下:(执行计划)
对于参数嗅探问题,可以使用部分编译、编译提示等功能来避免,更多的优化应该考虑数据和研究数据分布问题
6.--非参数化Ad—hoc查询
Ad-hoc称为即席查询,可以理解为没有使用存储过程、SP_Executesql或其他方式强制预定义SQL语句。
如:SELECT * FROM bt WHERE id=***这类查询引起的问题
可以把:高级--真对即席工作负荷进行优化:true
或者在数据库层面强制参数化:
ALTER DATABASE AdventureWorks2014 SET PARAMETERIZATION FORCED
7.非必要的并行查询
并行操作会把一个查询分开到多个线程中执行,然后在合并到一起返回结果
数据库事务:
事务是对数据库操作的单元,可以是一个Select语句,也可以是包好多个Select、Update、Delete、Insert的操作的命名集合
1.原子性:意味着一个事务内的所有操作必须全部完成或者全部回滚。
2.一致性:要求整个事务在运行的前后数据库的状态必须一致,不能打破数据定义中的一致性约束
3.隔离性:保证同一时间中,一个事务的运行不能被另一个事务影响。
4.持久性:事务一旦提交成功,将永久存储到服务器的文件系统中,即使系统在中途奔溃,所发生的的效果都不会丢失,这个会通过日志来保证。
显示事务隐式事务(区别在于创建和提交的方式)
隐式事务:由SQL Server自己去开启和提交/回滚,并且在内部保证ACID特性。
显示事务:以Begin Tran/Transaction开始以Commit Tran/Transaction 或者Rollback Tran结束
转载于:https://www.cnblogs.com/sunliyuan/p/8546629.html
SQLServer 常见高CPU利用率原因相关推荐
- 震惊,用了这么多年的 CPU 利用率,其实是错的
来源:内核月谈, 原文链接: http://www.brendangregg.com/blog/2017-05-09/cpu-utilization-is-wrong.html 本文中若有任何疏漏错误 ...
- CPU 利用率背后的真相,只有 1% 人知道
导读:本文翻译自 Brendan Gregg 去年的一篇博客文章 "CPU Utilization is Wrong",从标题就能想到这篇文章将会引起争议. 文章一上来就说,我们& ...
- numa节点间CPU利用率不均衡 - wakeup affinity
最近遇到服务器numa节点间cpu利用率不均衡,清除sched_domain的flags中的AFFINE_WAKEUPS标志位是一个优化方法.但是如果直接将AFFINE_WAKEUPS关闭,将无法充分 ...
- 14.Linux rpm,brew软件安装包命令,zsh和bash,内置命令和外部命令,ps命令,top命令解析,swp,为什么cpu利用率很低,负载却很高?
解释一下rpm, opt,opt-get, brew,brewhome rpm,apt,apt-get,brew,和homebrew都是与软件包管理有关的术语.它们分别用于不同的操作系统. rpm是一 ...
- 记录一次服务器CPU负载高,利用率正常的处理方法
背景: 在一次查看服务器监控的时候偶然发现其中一台服务器的CPU负载很高,但是CPU利用率基本没有,通过top命令完全看不出来问题所在,经过一些思路的排查发现了原因并处理,现记录下来. 现象: top ...
- java程序CPU使用率高可能的原因
1. 前言 在Java并发编程方面,如何在多线程环境中设置合理的线程数,那我们需要了解两个概念: 计算密集型 要进行大量的计算.逻辑判断等操作,消耗CPU资源,比如计算圆周率.对视频进行高清解码等等, ...
- 【华为云技术分享】MongoDB经典故障系列六:CPU利用率太高怎么办?
618大促,全民狂欢,但热闹是属于疯狂剁手的人们.而开发者们有的缺是"高流量.高访问.高并发"三高下带来的种种问题.为了应对大促期间的高I/O情况,企业会选择MongoDB云数据库 ...
- 电脑CPU占用率高是什么原因造成的? 与解决方法
电脑CPU占用率高是什么原因造成的? CPU占用率高的九种可能 1.防杀毒软件造成故障 由于新版的KV.金山.瑞星都加入了对网页.插件.邮件的随机监控,无疑增大了系统负担.处理方式:基本上没有合理的处 ...
- rabbitmq beam.smp cpu利用率过高
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件).RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的.所有主要 ...
最新文章
- Uber开源TensorFlow框架工具箱Ludwig,无需编码即可进行深度学习开发
- java中final关键字的用法
- ubuntu 访问php没反应,linux - 在Ubuntu中,我对php.ini进行了更改,但没有任何反应 - Ubuntu问答...
- 【哲学】形而上学具体指什么?metaphysics
- VUEX源码学习笔记(第5~6章 共6章)
- android log system
- angular路由操作中'#'字符的解决办法
- hp laser103 属性没有配置项_(常见解决方法)UEditor报错“后端配置项没有正常加载,上传插件不能正常使用”...
- 【LeetCode】剑指 Offer 46. 把数字翻译成字符串
- Linux shell - 按时间和文件大小排序显示文件(ll)
- mysql选择产品和功能_mysql - 产品属性选择
- nginx绑定IP的坑
- Matlab使用过程中内存不足问题的总结(修改)
- VBS操作Excel数据
- 数字图像处理课后习题汇总
- 计算机专业wor知识,计算机专业毕业实习日记精选
- 客服客户聊天系统源码分享
- shader02-仿星空粒子
- 20145234黄斐《信息安全系统设计基础》第三周学习总结
- 第13章-1~3 法兰接头预紧力密封接触分析(模型简化、网格调整、约束)并行计算设置、摩擦接触设置adjust to touch 、约束设置frictionless support、bolt