您的位置:首页 > 数据库 > 数据库管理

sql server占cpu高

更多 2014/12/28 来源:数据库管理学习浏览量:1226
学习标签: sql server
本文导读:项目中有时会遇到SqlServer占用Cpu很高,而且并不下降,一般引起 Sql Server 产生性能问题的,都是 阻塞、连接数、IO 磁盘等。下面介绍Sql Server 在做哪些操作的时候,会比较集中使用 CPU 资源呢?

一、sql server占cpu高的常见原因

1、编译和重编译

编译是 Sql Server 为指令生成执行计划的过程。Sql Server 要分析指令要做的事情,分析它所要访问的表格结构,也就是生成执行计划的过程。这个过程主要是在做各种计算,所以CPU 使用比较集中的地方。

执行计划生成后会被缓存在 内存中,以便重用。但是不是所有的都可以 被重用。在很多时候,由于数据量发生了变化,或者数据结构发生了变化,同样一句话执行,就要重编译。

 

2、排序(sort) 和 聚合计算(aggregation)

在查询的时候,经常会做 order by、distinct 这样的操作,也会做 avg、sum、max、min 这样的聚合计算,在数据已经被加载到内存后,就要使用CPU把这些计算做完。所以这些操作的语句CPU 使用量会多一些。

 

3、表格连接(Join)操作

当语句需要两张表做连接的时候,SQLServer 常常会选择 Nested Loop 或 Hash 算法。算法的完成要运行 CPU,所以 join 有时候也会带来 CPU 使用比较集中的地方。

 

4、Count(*) 语句执行的过于频繁

特别是对大表 Count(*) ,因为 Count(*) 后面如果没有条件,或者条件用不上索引,都会引起 全表扫描的,也会引起 CPU 的大量运算

 

二、sql server占cpu高的解决办法

 

1、紧急处理时,可以重启Sql Server 的服务,当然,如果 DB 是在线的 DB ,请谨慎此操作

2、2. 利用 SqlServer Profiler 来抓去语句,找出耗性能的SQL 语句,优化点。可以说,Sql 语句就好比 Sql server 的性能之匙,80 % 以上的 SQL SERVER 性能问题都是 SQL 语句引起的

3、查询前10个最耗CPU时间的SQL语句

 
 
SQL 代码   复制


            
--在SSMS里选择以文本格式显示结果

SELECT TOP 10 

dest.[text] AS 'sql语句'

FROM sys.[dm_exec_requests] AS der 

CROSS APPLY 

sys.[dm_exec_sql_text](der.[sql_handle]) AS dest 

WHERE [session_id]>50  

ORDER BY [cpu_time] DESC

        

4、 查询CPU占用高的语句

 

 
SQL 代码   复制


            
SELECT TOP 10

   total_worker_time/execution_count AS avg_cpu_cost, plan_handle,

 

   execution_count,

 

   (SELECT SUBSTRING(text, statement_start_offset/2 + 1,

 

      (CASE WHEN statement_end_offset = -1

 

         THEN LEN(CONVERT(nvarchar(max), text)) * 2

 

         ELSE statement_end_offset

 

      END - statement_start_offset)/2)

 

   FROM sys.dm_exec_sql_text(sql_handle)) AS query_text

 

FROM sys.dm_exec_query_stats

 

ORDER BY [avg_cpu_cost] DESC

        

 

5、查看占用CPU高的SQL语句的执行计划,找出占用高的原因

例如

 

6、选择top记录时,尽量为order子句的字段建立索引

7、通过建立包含索引来让SQL语句走索引

 

三、sql server占cpu高的总结

 

1、服务器CPU过高,首先查看系统进程,确定引发CPU过高的进程

2、通过SQLServer Profiler能够轻易监控到哪些SQL语句执行时间过长,消耗最多的CPU

3、通过SQL语句是可以查看每条SQL语句消耗的CPU是多少

4、导致CPU高的都是进行大量计算的语句:包括内存排序、表扫描、编译计划等。

5、如果使用Top刷选前面几条语句,则尽量为Order By子句建立索引,这样可以减少对所有的刷选结果进行排序

6、使用Count查询记录数时,尽量通过为where字句的相关字段建立索引以减少表扫描。如果多个表进行join操作,则把相关的表连接字段建立在包含索引中

7、通过服务端通知的方式,减少SQL语句的查询

8、通过表分区,尽量降低因为添加索引而导致表插入较慢的影响

 

收藏
145
很赞
242