首页 存档 技术 查看内容

程序猿是如何解决SQL Server占CPU100%的

2018-3-30 13:00 |来自: 互联网 813 0

摘要: 来自:马非码 - 博客园 链接: www.cnblogs.com/marvin/p/ASolutionForSQLServerCauseHighCPU.html(点击尾部阅读原文前往) 文章目录 遇到的问题 使用SQLServer Profiler监控数据库 SQL1:查找最新的30条告警 ...

来自:马非码 - 博客园

链接:

www.cnblogs.com/marvin/p/ASolutionForSQLServerCauseHighCPU.html(点击尾部阅读原文前往)


文章目录


  • 遇到的问题

  • 使用SQLServer Profiler监控数据库

    • SQL1:查找最新的30条告警事件

    • SQL2:获取当前的总报警记录数

  • 有哪些SQL语句会导致CPU过高?

  • 查看SQL的查询计划

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

    • 查看SQL语句CPU高的语句

    • 通过建立相关索引来减少表扫描

  • 其他优化手段

  • 总结


遇到的问题


有同事反应服务器CPU过高,一看截图基本都是100%了,my god,这可是大问题,赶紧先看看。



让同事查看系统进程,发现是SQLServer的CPU占用比较高。首先想到的是不是报表生成的时候高,因为这块之前出现过问题,关掉服务程序,还是高。难道是客户端程序引发的?但是这么多的客户端连接,难不成每个都叫人关闭,很简单,把网络断开即可。网络断开之后,CPU立马下降。那么问题到底在哪里呢,是时候祭出我们的利器了SQLServer Profiler。


使用SQLServer Profiler监控数据库


让同事使用SQLProfiler监控了大概20分钟左右,然后保存为跟踪文件*.rtc。



我们来看看到底是哪句SQL有问题:


SQL1:查找最新的30条告警事件


selecttop30a.orderno,a.AgentBm,a.AlarmTime,a.RemoveTime,c.NameasAddrName,b.NameasMgrObjName,a.Ch,a.Value,a.Content,a.Level

,ag.NameasAgentServerName,a.EventBm,a.MgrObjId,a.Id,a.Cfmoper,a.Cfm,a.Cfmtime,a.State,a.IgnoreStartTime,a.IgnoreEndTime

,a.OpUserId,d.NameasMgrObjTypeName,l.UserNameasuserName,f.NameasAddrName2

fromeventlogasaleft joinmgrobjasbona.MgrObjId=b.Idanda.AgentBm=b.AgentBm

left joinaddrnodeasconb.AddrId=c.Idleft joinmgrobjtypeasdonb.MgrObjTypeId=d.Id

left joineventdiraseona.EventBm=e.Bmleft joinagentserverasagona.AgentBm=ag.AgentBm

left joinloginUseraslona.cfmoper=l.loginGuidleft joinaddrnodeasfonag.AddrId=f.Id

where((MgrObjIdin(

selectIdfromMgrObj

whereAddrIdin('','02100000','02113000','02113001','02113002','02113003','02113004'

,'02113005','02113006','02113007','02113008','02113009','02113010','02113011','02113012'

,'02113013','02113014','02113015','02113016','02113017','02113018','02113019','02113020'

,'02113021','02113022','02113023','02113024','02113025','02113026')))

or(mgrobjidin('00000000-0000-0000-0000-000000000000','00000000-0000-0000-0000-000000000000'

,'00000000-0000-0000-0000-000000000000','11111111-1111-1111-1111-111111111111'

,'11111111-1111-1111-1111-111111111111'))

)

order byalarmtimeDESC


SQL2:获取当前的总报警记录数


select count(*)from eventlogasaleft join mgrobjasbona.MgrObjId=b

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部