理系学生日記

おまえはいつまで学生気分なのか

Oracle でのページング

RMI でスレッド起動されるロジックにおいて、数十万程度の処理対象レコードを DB から一度に読みこむ形でプログラムを実装してたのだけれど、あんまり RMI が呼ばれすぎるとメモリが枯渇してヤベーみたいな話になったので、ページングさせて小分けに処理することになった。
Oracle DB だと確かページング用の命令があったよなーと思って調べたのだけど存在してなくて、ぼくの記憶は完全にクソということが判明。実直に ROW_NUMBER を使ってページングする流れ。

SELECT 
    SEQA, 
    SEQB
FROM (
    SELECT 
        SEQA, 
        SEQB,
        ROW_NUMBER() OVER (ORDER BY SEQA, SEQB) RNO
    FROM
        TABLEA
    WHERE
        HOGE HOGE HOGE
)
WHERE
    RNO BETWEEN from AND to
ORDER BY RNO