CPU性能瓶颈

摘要:
1.克服和重新编译2。排序和聚合计算3。表联接操作4。执行计划效率低下5。并行查询的克服、重新编译和重新编译是sqlserver生成指令执行计划的过程。此比率表示每秒在请求的批处理中需要编译或重新编译的请求数。

CPU性能瓶颈可以从计数器 Processor:%Processor .如果这个很高,还要再检查sql server的Process:%processor Time是否也很高,以确定是否是sql server消耗的

CPU.

CPU高的原因:

        1.过度编译和重编译

        2.排序和聚合计算

    ​    ​3.表格连接操作

    ​    ​4.低效的执行计划

        5.并行查询

  1. 过度编译和重编译

    编译是sql server为指令生成执行计划的过程。分析指令要做的事情,分析它要访问的表结构,以及上面的索引,还要分析表格里的数据分布,最后推断出一个认为比较优化的执行计划。这个过程主要是在做各种计算,所以说是使用CPU比较集中的地方。

    重编译:很多时候,由于数据量发生了变化,或者表结构变化。同样的一句话,还要再次把执行计划再做一遍,这个过程就是重编译

    看计数器 SQl Recompilations 对Batch Request /Sec 的比率和Sql Compilations 对 Batch Request /Sec 的比率。这个比率表示每秒请求的批处理中有多少个请求需要编译或者重编译。

    一般建议重编译比率  不超过1%。  编译比率  不超过10%。

    如果说这个比率比较高,需要跟踪一下。

    –SP: Recompile –RPC: Completed –Auto Stats   引起重编译和编译的原因,可能有以下情况

    1)set 语句的变化

    2)统计信息发生变化

    3)不明确的对象名称  --使用明确的对象名称

    4)HINT提示   --去掉 WITH RECOMPILE

  2. 排序和聚合运算

    在查询的时候,经常会做order by,distinct这样的操作,也会做avg,min,max,sum这样的聚合计算。在数据已经被加载到内存后,就要使用cpu把这些计算做完。所以这也是耗费cpu的地方。

  3. 表格join操作

    当语句需要两张表做连接的时候,sql server常常会选择Nested Loop 或者hash算法。算法的完成要运行cpu。尤其是当sql server选择了错误的连接算法的时候。

  4. 低效的执行计划

    1)过时的统计信息

    2)缺失索引

    3)错误的索引

    4)代码质量

  5. ​并行查询      

    如果查询的开销 > 并行的开销阈值 (默认为5 秒), 查询将会并行执行 在大多数情况下,并行能够加强查询的性能然而,一个给定查询的响应时间必须从整个系统的吞吐量和系统          上的其他查询出发来综合考虑。

    比如说一条指令要读入100万条记录。如果一个线程做,可能需要10秒,如果10个线程做,每个线程读10万条记录,可能每个线程只需要1秒,就算加上线程间同步时间,可能总共2秒就完成了。缩短了查询的时间。但是在这2秒里,有10个cpu需要全力运行这10个线程,别的用户发过来的指令会受到影响,甚至可能会拿不到cpu执行。

    对于并发度要求比较高,每个用户都要求有及时响应的OLTP系统,一般会建议设置每个指令都只用一个线程执行,从而保证SQL SERVER在任何一个时间点,都有多个CPU可以响应多个请求。即把 Max Degree of Parallelism 设成1.

    对于并发用户比较少的,经常会有复杂查询的系统,可以把Max Degree of Parallelism的值设成cpu的数量值。如果也要考虑并发,可以设成小一点。

 如果说当前系统cpu比较高,也可以通过动态管理视图来查询:

select

   highest_cpu_queries.*,q.dbid,

   q.objectid, q.number, q.encrypted, q.[text]

from

   (select top 50 qs.*

   from sys.dm_exec_query_stats qs

   order by qs.total_worker_time desc) as highest_cpu_queries

   cross apply sys.dm_exec_sql_text(plan_handle) as q

order by highest_cpu_queries.total_worker_time desc

go

 或者找最经常做重编译的存储过程

select top 25 sql_text.text, sql_handle, plan_generation_num,  execution_count,

   dbid,  objectid

from sys.dm_exec_query_stats a

   cross apply sys.dm_exec_sql_text(sql_handle) as sql_text

where plan_generation_num >1

order by plan_generation_num desc

go

免责声明:文章转载自《CPU性能瓶颈》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Nocas服务注册与发现element ui的表格列设置fixed后做动态表格出现表格错乱下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

关于sql的执行计划(推荐详细)

刚开始用SQL Server的时候,我没有用显示执行计划来对查询进行分析。我曾经一直认为我递交的SQL查询都是最优的,而忽略了查询性能究竟如何,从而对“执行计划”重视不够。在我职业初期,我只要能获取数据就很开心,而不去考虑数据是如何返回的,“执行计划”对我的查询作了什么工作。我以为SQL Server会自己去处理查询的性能问题的。作为一个刚进入IT行业或...

如何有效使用Project(1)——编制进度计划、保存基准

1.前言: 软件产品的研发、升级、定制等,一般都是以项目的形式进行,此时项目进度计划以及资源使用情况就变成了项目经理关注的重点。如何让项目计划有效可控,及时暴露问题?如何查看资源的负荷情况,看资源分配是否合理。 当然,如果你的公司已经实施了专门的PM软件来监督管控,可以忽略本文。否则,你可以用微软的Project来做到这一工作。 我也算是一个专业的从事...

查看SqlServer的内存使用情况

      上一篇提到动态T-SQL会产生较多的执行计划,这些执行计划会占用多少内存呢?今天从徐海蔚的书中找到了答案。动态视图不仅可以查到执行计划的缓存,数据表的页面缓存也可以查到,将SQL整理一下,做个标记。 -- 查询SqlServer总体的内存使用情况 select type , sum(virtual_memory_re...

MAKEFILE 编程基础之一【转】

本文转载自:http://www.himigame.com/gcc-makefile/766.html 概述: 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但...

GPU微观物理结构框架

 GPU微观物理结构框架 一.CPU 和 GPU 在物理结构和设计上有何区别 首先需要解释CPU(Central Processing Unit)和GPU(Graphics Processing Unit)这两个缩写分别代表什么。CPU即中央处理器,GPU即图形处理器。其次,要解释两者的区别,要先明白两者的相同之处:两者都有总线和外界联系,有自己的缓存体系...

SSIS 处理错误的方法

Package在执行过程中,不可避免地会发生错误,如果处理错误?简单粗暴的做法,是Package直接停止运行。对于一个成熟的ETL工具,这显然不是唯一的错误处理方法。如果在数据流中出现错误,那么数据流组件可以把错误行输出,这只需要在组件的ErrorOutput中进行简单地配置。跟数据流相比,控制流中包含错误处理程序OnError,对错误事件的处理更加复杂和...