あるカラムの前後を取得するのが重いんです
環境
- Oracle10g
普通はこんなやりかた
select prev,next from ( select id, lag( id ) over( order by id ) as prev, lead( id ) over ( order by id ) as next from hoge ) where id = :ID;
でもこれだとすげー遅い。
なので、もっと効率よくとれないかと思って色々やってみた。
そもそも lag,lead を使うのをやめる
select h.id, h.name from hoge h, ( select max( id ) as id from hoge where id < :ID order by id ) prev, ( select min( id ) as id from hoge where id > :ID order by id ) next where h.id in ( prev.id, :ID , next.ID ) and rownum <= 3;
lag,lead とちがって max,minならフルアクセスしないで1レコードしか取ってこないから激早
ついでにいうと、 in の中の要素数を rownum <= で指定してやるとさらに効果大
よかった、一安心。
ちなみに、mysql なら・・・
select id as prev from hoge where id < :ID order by id asc limit 1; select id as next from hoge where id > :ID order by id desc limit 1;
これだけでいいのに。。