あるカラムの前後を取得するのが重いんです

環境

  • 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;

これだけでいいのに。。