ROWNUM 擬似列
ROWNUM 擬似列の特徴は
- ソート前の抽出した結果セットのレコード番号をあらわす。
- WHERE 条件に入れることでレコード数を制限できる。(オプティマイザに助言をあたえている)
- 条件の評価順序は、その条件文において最後に評価される。
- ORDER BY と WHERE に併用すると WHERE 条件が先に評価される。
- 行番号 (ROWNUM) の割り当ては並び替え処理前の条件に一致したデータ取り出し時に割り当て済みである。
抽出した結果レコードのレコード番号をあらわす
ROWNUM は結果セットに対する一意の昇順の行番号を割り当てる。(取り出し順)
SELECT ROWNUM FROM EMP ;
ROWNUM
----------
1
2
...
取得するレコード数の制限
ROWNUM を条件に加えることで 行番号 (ROWNUM) の条件を除いて絞り込んだ結果 から取得レコード数を制限する。
条件に該当するレコードから任意(※1)の 10 行を取り出すための条件の例は、
WHERE conditions AND ROWNUM <= 10 ;
ROWNUM を指定するとオプティマイザは取得する件数をあらかじめ知ることができるため
パフォーマンスが向上する機会がある。また 指定したレコードを取得した時点でフェッチ処理を終了する(実行計画 に記される STOPKEY)。つまり、一貫性読込み回数も減少する可能性が非常に高くなる。
(※1) 任意とは規則性があるが保証されない状態
取り出される順番はオプティマイザによって決定される。コストベース・オプティマイザ の場合には条件の リテラル が変化するだけでも ヒストグラム統計 によって アクセスパス が再調整される可能性がある。
取り出し順番は常に変動するものだと考えておく。この段階での取り出し順には ORDER BY での指定は考慮されない。(※2)
(※2) 並び替えにインデックスが利用できる場合、インデックスを使用するアクセスパスに変化する可能性はある。
参考: 並び替え (ORDER BY) 、ヒストグラム
ROWNUM = 1 <-- 1件のみ
... <= n ( n >= 1 )
... BETWEEN 1 AND n <-- 1〜n件 ( n >= 1 )
... > 0 <-- 記述できるが意味が無い
... >= 1 <-- 同上
SELECT * FROM EMP WHERE ROWNUM = 2 ;
レコードが選択されませんでした。
n 番目のレコードを取り出すために ROWNUM を使用すると思惑通りに動作しない(結果は 0件になる)
これは STOPKEY によるもので 1 レコードから評価し、行番号への評価が偽になった時点で終了する。
つまり ROWNUM = 2 を最初のレコードで評価した場合 1 =2 .. false になり取り出し処理が終了される。
そのために 1 レコードも選択されないという結果となった。
ORDER BY 後に ROWNUM を指定する
ORDER BY の後に行番号を指定するにはインラインビューか ROW_NUMBER 分析関数 を
使用する方法がある。
⇒ 上位 n レコードの取得、中間 n 〜 m 位のレコードの取得する方法
関連事項