使用oracle + ibatis進(jìn)行數(shù)據(jù)分頁(yè)查找時(shí),對(duì)傳入的參數(shù)start與size,進(jìn)行如下查找語(yǔ)句
select * from
(select t.*, romnum rn from
(select * from user
where score > #score#
order by $orderby$
) t
where rownum <= #start# + #size# )
where rn > #start#
在數(shù)據(jù)量較少時(shí),以上語(yǔ)句沒(méi)有問(wèn)題,但是在達(dá)到500w+數(shù)據(jù)量時(shí),就會(huì)發(fā)生急劇的性能下降,經(jīng)過(guò)測(cè)試,發(fā)現(xiàn)應(yīng)該改為以下的語(yǔ)句,就可以避免,在千萬(wàn)數(shù)據(jù)以上仍可以在百毫秒得出結(jié)果
select * from
(select t.*, romnum rn from
(select * from user
where score > #score#
order by $orderby$
) t
where rownum <= $start$ + $end$ )
where rn > #start#
因?yàn)閕batis會(huì)將#xxx#參數(shù)解析為PreparedStatement中的?,但是如果使用#start#+#size#,會(huì)產(chǎn)生?+?的語(yǔ)句,影響oracle語(yǔ)句動(dòng)態(tài)解析,實(shí)際上這個(gè)參數(shù)在執(zhí)行時(shí)完全可以先計(jì)算和,再作為一個(gè)值傳入語(yǔ)句,采用$start$+$size$正是做到了這點(diǎn),大大加快了執(zhí)行速度