当前位置:数据库 > 数据库管理> 正文

sql server占cpu高

时间:2014-12-28类别:数据库

sql server占cpu高

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、通过表分区,尽量降低因为添加索引而导致表插入较慢的影响

     

    标签:
    上一篇下一篇

    猜您喜欢

    热门推荐