CPU性能瓶颈

CPU性能瓶颈能够从计数器 Processor:%Processor .若是这个很高,还要再检查sql server的Process:%processor Time是否也很高,以肯定是不是sql server消耗的算法

CPU.sql

CPU高的缘由:并发

        1.过分编译和重编译app

        2.排序和聚合计算oop

    ​    ​3.表格链接操做性能

    ​    ​4.低效的执行计划优化

        5.并行查询线程

 

 

 

  1. 过分编译和重编译server

    编译是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

相关文章
相关标签/搜索