使用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$正是做到了这点,大大加快了执行速度