立即注册 登录
关注IT社区 返回首页

o0JSP的个人空间 http://u.gzit.org/?27 [收藏] [复制] [分享] [RSS]

日志

因硬解析过度导致的CPU使用率直线上升问题处理

已有 838 次阅读2015-12-16 09:58 |个人分类:Oracle

        这个是之前友情协助朋友解决的一个问题,一直忘记总结起来了,趁今天有点时间记录一下,以便跟大家共享。事情过程大致是这样:朋友负责某政府单位一个项目的系统集成工作,项目实施完成后,系统开发商的程序部署上去运行以后,CPU就一直居高不下,业务高峰期的时候系统直接处在无响应的状态。对于新采购的硬件设备,这是甲方所不能容许的,据说甲方的头头都跳起来了,并拍桌子扬言要换开发商的节奏。开发商自然也肯定不会默认,硬是说程序没有问题,是数据库的性能指标没达到要求,问题出现在数据库层面。项目卡在这个环节一直没得验收,朋友也心急如焚,后面就叫我过去帮看看到底是什么回事,虽然心里也觉得跟数据库没有问题,但是毕竟也缺乏相关的证据支撑。
        到达客户现场以后,跟开发商接触了一下,初步了解了具体的情况。业务上的现象大致如下:该业务系统需要同步向上级单位传送部分业务数据。由于实时性要求挺高,所以开发商写了一个程序,每2秒钟就查询一次相关业务数据表的数据,并把最新生成的数据提交到相关接口,并且,该程序除了每2秒钟执行一次以外,还启用了并发的机制,开了20个线程并发。开发商为什么一口咬定是数据库的问题呢?原因如此:
        开发商的项目经理向我质问:”我们做过测试了,那个查询数据的SQL语句,如果不加WHERE条件的话,同样是20个并发,CPU涨到40%多就不涨了,但是加了WHERE条件以后就一直不断增长,20个并发一直涨到60%多。你说这个难道不是数据库的问题吗?“
        ”你们是怎么写的SQL语句?“
        "SELECT XXX FROM TEST" 和 "SELECT XXX FROM TEST WHERE AAA='+变量+'"
         看到这里,大家应该就知道他的CPU为什么会暴涨了吧?
         因为第二种方式开发人员采用的是动态拼凑SQL语句的方式来实现,这样对于ORACLE来说,每次执行的都是不一样的SQL语句,每次执行都需要先进行解析,所以导致了CPU不断暴涨。而第一个语句只需要在第一次执行的时候解析一次而已,后面的都可以复用了。
       跟开发商的项目经理花了一点时间讲解Oracle处理SQL语句的方式,并建议其将程序进行调整,采用绑定变量的方式来实现。该项目经理将信将疑,不过还是叫开发人员按要求进行了调整。差不多半个小时以后,程序改好了,重新进行了测试运行,该程序执行起来以后,CPU从正常的10%几上升到了25%左右,然后就一直稳定在该值附近,不再上升。
        看到这个情况,开发商哑口无言,基本上这个问题算是告一段落了,跟朋友说明了一下情况,然后就从现场撤回了,告诉朋友说如果还有什么问题再给我电话吧。后面一直也没见朋友再反馈有什么问题,看到开发商是终于承认自己的程序的问题,需要将相关的程序进行修改了。
        结束语:还是要以Oracle所设想的方式去使用它,才能够让它将潜力发挥到极致。

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

Archiver|关注IT ( 粤ICP备06100905号 )

GMT+8, 2018-12-13 03:41 , Processed in 0.101669 second(s), 13 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部