美文网首页
关于简单改进ibatis的默认分页机制提高查询效率方案

关于简单改进ibatis的默认分页机制提高查询效率方案

作者: lpj24 | 来源:发表于2015-01-16 09:54 被阅读584次

    最近在做一个ibatis+extjs的项目,在做的过程中遇到一个问题,一条查询语句如下(原语句)

    select ib.* ,(select sum(it.fconsignamount) from icstockbillentry it where it.finterid=ib.finterid) ysje,(select sum(t.skje) from collectionrecords t where t.djbh=ib.fbillno) skje1,from icstockbill ib left join customer cu on cu.id = ib.fsupplyid

    where 1=1虽然只是一条简单的语句但是查询效率极慢大约5-6秒,因为select列表中有一个聚合函数,我想一般做oa项目这样的求和是不可避免的吧。这个查询的执行过程大概是这样的,Extjs在前台传递一个start和count(count代表查询记录数,start代表开始数),然后经过action处理(不解释),调用

    queryForList(statementName, qDto, intStart.intValue(), end.intValue());我们在控制台查看语句发现分页是这样的between 1 and 20,去掉分页之后反而速度更快,原来oracle的分页是嵌套查询的,between……and反而更慢。在网上查了一下有的说需要改源码,将hibernate方式注入等等,但是我做的是公司项目,框架都是封装了改动是十分困难的,然后在ibatis中的查询语句修改一下(如下)

    select * from ( select rownum rn,ib.* ,(select sum(it.fconsignamount) from icstockbillentry it where it.finterid=ib.finterid) ysje, from icstockbill ib left join customer cu on cu.id = ib.fsupplyid where 1=1 and rownumto_number(#count#)) where rn ]]>to_number(#start#)  ,然后在action中取出start和count,if(start!=0){  count= start+count};

    最后直接调用ibatis的queryForList(statementName, new oo());oo里面存放了start和count的属性,只用这三步查询效率会大大提高

    相关文章

      网友评论

          本文标题:关于简单改进ibatis的默认分页机制提高查询效率方案

          本文链接:https://www.haomeiwen.com/subject/rmscxttx.html