问题

sql server进程占用cpu一直很高,重启服务器也无效。

原因分析

有哪些SQL语句会导致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
的大量运算

解决步骤

  1. 使用SQL Server Profiler进行分析。
    开始--程序--Microsoft SQL Server 2005--性能工具--SQL Server Profiler

新建跟踪,20分钟就行。
另存一下跟踪文件。
2.进行优化
开始--程序--Microsoft SQL Server 2005--性能工具--数据库引擎优化顾问
工作负荷:选择跟踪文件
选择需要优化的数据库。
等待很久,查看建议和报告。
应用所有建议
检查一下效果。

总结

一般sql占用cpu过高可能和索引有关,可以重建索引。

参考

1.程序猿是如何解决SQLServer占CPU100%的
2.SQL Server Profiler:使用方法和指标说明


本文由 星际蜗牛 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论