初一七月

你必须承认,我们生存的这个世界取决于自身的能力而非别人的保护(AW)
随笔 - 23, 文章 - 0, 评论 - 11, 引用 - 0
数据加载中……

oracle分页查找时,start与size在ibatis中的设置

使用oracle + ibatis进行数据分页查找时,对传入的参数start与size,进行如下查找语句
select * from
  (select t.*, romnum rn from
    (select * from user
       where score > #score# 
       order by $orderby$
     ) t 
   where rownum <= #start# + #size# )
where rn > #start#
在数据量较少时,以上语句没有问题,但是在达到500w+数据量时,就会发生急剧的性能下降,经过测试,发现应该改为以下的语句,就可以避免,在千万数据以上仍可以在百毫秒得出结果
select * from
  (select t.*, romnum rn from
    (select * from user
       where score > #score# 
       order by $orderby$
     ) t 
   where rownum <= $start$ + $end$ )
where rn > #start#

因为ibatis会将#xxx#参数解析为PreparedStatement中的?,但是如果使用#start#+#size#,会产生?+?的语句,影响oracle语句动态解析,实际上这个参数在执行时完全可以先计算和,再作为一个值传入语句,采用$start$+$size$正是做到了这点,大大加快了执行速度

posted on 2012-07-13 14:41 初一七月 阅读(798) 评论(0)  编辑  收藏 所属分类: DB


只有注册用户登录后才能发表评论。


网站导航: