互联网服务数据库性能调优

informix中SQL语句通过执行计划显示正常,但占CPU高

最近对应用程序进行压力测试时,发现informix数据库的CPU使用率很高。于是对应用程序进行调查,找到了引起数据库CPU使用率高(平均达到80%了)的SQL语句,同时这个SQL也是导致应用程序处理时间长的元凶(整个应用执行400ms左右,这一段SQL语句就执行了200ms左右,而该应用程序中还有其他几个SQL查询的表数据量比这张表大)。但是通过执行计划查看时,却没有发现异常,执行计划结果如下:
QUERY: (OPTIMIZATION TIMESTAMP: 04-14-2015 19:13:55)
------
SELECT  count(*),sum(jyje)
FROM YW_JYLS_FUND
WHERE ZRRQ = '20150414' AND KHBH = 'khbh0000001' AND CPDM = '000575'
AND JYDM IN('20013','20012')AND YWDM='124' AND ((JYZT='5' AND ZJZT ='c') OR (JYZT = '4' AND ZJZT = '8') OR JYZT = 'Z')

Estimated Cost: 76
Estimated # of Rows Returned: 1

  1) gafe.yw_jyls_fund: INDEX PATH

        Filters: (((((((gafe.yw_jyls_fund.zjzt = 'c' AND gafe.yw_jyls_fund.jyzt = '5' ) OR (gafe.yw_jyls_fund.zjzt = '8' AND gafe.yw
_jyls_fund.jyzt = '4' ) ) OR gafe.yw_jyls_fund.jyzt = 'Z' ) AND gafe.yw_jyls_fund.ywdm = '124' ) AND gafe.yw_jyls_fund.khbh = 'khbh0
000001' ) AND gafe.yw_jyls_fund.jydm IN ('20013' , '20012' )) AND gafe.yw_jyls_fund.cpdm = '000575' )

    (1) Index Name: gafe.idx_jyls_fund1
        Index Keys: zrrq tadm   (Serial, fragments: ALL)
        Lower Index Filter: gafe.yw_jyls_fund.zrrq = '20150414'


Query statistics:
-----------------

  Table map :
  ----------------------------
  Internal name     Table name
  ----------------------------
  t1                yw_jyls_fund

  type     table  rows_prod  est_rows  rows_scan  time       est_cost
  -------------------------------------------------------------------
  scan     t1     0          1         0          00:00.00   77      

  type     rows_prod  est_rows  rows_cons  time
  -------------------------------------------------
  group    1          1         0          00:00.00

我看rows_scan为0,那应该就是并没有去扫描大部分数据,为什么还会引起CPU使用率高,同时处理时间也比较长。
说明:应用程序中还有其他大表关联查询的SQL语句的处理时间以及对CPU的影响都很小,唯独这个SQL语句影响很大,应该是需要优化的,但是从执行计划来看,却又看不出来哪里的问题,小弟对执行计划知道的不多,只会简单的查看几个指标,其中一个就是rows_scan,SQL语句在执行计划结果中,麻烦大家帮忙看下,给点指引,感激不尽!
参与4

4同行回答

caidoudtcaidoudt软件开发工程师平欣电子科技有限公司
回复 4# liaosnet 应该是你说的这种吧,后来把SQL中的条件换了下,让它落在另一个索引,处理时间和数据库CPU使用率真都下降明显了,耗时10ms左右,CPU使用率不超过10%。谢谢你的回帖:)显示全部
回复 4# liaosnet
应该是你说的这种吧,后来把SQL中的条件换了下,让它落在另一个索引,处理时间和数据库CPU使用率真都下降明显了,耗时10ms左右,CPU使用率不超过10%。
谢谢你的回帖:)收起
互联网服务 · 2015-04-17
浏览730
liaosnetliaosnet信息分析/架构师gbasedbt.com
执行计划实施上在第一次执行SQL时根据系统信息生成的查找路径,并不会根据你的第一个条件无返回就改变执行计划。故它仍会按照路径的需求查找所需要的数据,所以整个计划路径仍会走一次。...显示全部
执行计划实施上在第一次执行SQL时根据系统信息生成的查找路径,并不会根据你的第一个条件无返回就改变执行计划。故它仍会按照路径的需求查找所需要的数据,所以整个计划路径仍会走一次。收起
IT咨询服务 · 2015-04-15
浏览755
caidoudtcaidoudt软件开发工程师平欣电子科技有限公司
回复 2# liaosnet 使用nmon工具监控到CPU使用率高的。把代码中这个SQL语句的执行注释掉去压力跑的时候,数据库的CPU平均使用10左右。所以断定,是这个SQL的查询导致数据库CPU使用率高。同时在代码中加了打印当前系统时间的函数——gettimeofday来确定应用程序中这段SQL跑了...显示全部
回复 2# liaosnet
使用nmon工具监控到CPU使用率高的。把代码中这个SQL语句的执行注释掉去压力跑的时候,数据库的CPU平均使用10左右。所以断定,是这个SQL的查询导致数据库CPU使用率高。同时在代码中加了打印当前系统时间的函数——gettimeofday来确定应用程序中这段SQL跑了多久。之所以想要优化这段SQL,是因为应用程序中另一个地方,有一个SQL是五张表关联,每张表的数据量都比这张表多,处理时间才十几ms,同时也是因为太耗CPU了,怕后面生产环境压力增大引起生产数据库报警。
另外,对于informix的执行计划,我理解的是先使用索引,按照落在索引上的查询条件找到一些记录,然后在这些记录中再通过filter中的条件去筛选。从查询计划的结果看,rows_scan为0,即先使用索引去查找的时候,是没有记录的(事实也的确如此,数据库中并没有zrrq = '20150414'的记录),也就是即使有count,sum,or,in,但是这些条件没有数据对象来供它处理,那也应该马上返回吧。对于执行计划,我是一知半解,如果有理解错误的地方,麻烦帮忙指出。
还有,感谢您的回复!收起
互联网服务 · 2015-04-15
浏览793
liaosnetliaosnet信息分析/架构师gbasedbt.com
200ms的SQL没有优化价值。从你的SQL上看,有count,sum,有group by,有in, or操作,费点CPU很正常。。BTW:你们是如何监控到200ms的CPU高的?请教。。。显示全部
200ms的SQL没有优化价值。
从你的SQL上看,有count,sum,有group by,有in, or操作,费点CPU很正常。。

BTW:你们是如何监控到200ms的CPU高的?请教。。。收起
IT咨询服务 · 2015-04-15
浏览702

提问者

caidoudt
软件开发工程师平欣电子科技有限公司

相关资料

问题状态

  • 发布时间:2015-04-14
  • 关注会员:0 人
  • 问题浏览:4367
  • 最近回答:2015-04-17
  • X社区推广