【Oracle】ROWNUMはROW_NUMBERの下位互換なのか?後編

【Oracle】ROWNUMはROW_NUMBERの下位互換なのか?後編

こちらの記事の続きです。
今回は2つの行番号の振り方を実際に試して、
使い分けの指標が分かればいいなという内容です。

処理速度を比較してみた

同じように行番号を振るように、
ROWNUM版、ROW_NUMBER版でそれぞれSQLを用意し、
単純に実行してみて処理速度を比較してみます。

検索用のデータとして、
Oracleインストール時に用意されているサンプルDBにテーブルを作成し、
A5M2のテストデータ作成機能で適当なデータを100万件用意しました。
(適当な人名でテストデータを作ることも出来るんですね、ビックリです。)

まずはROWNUM版から。
画像のSQLを実行してみます。

ROW_NUMBERに行番号の振り方を合わせて、
TEST_NAME昇順で行番号を振り全件取得しています。
(同名でテストデータが作られちゃいました、より厳密な結果はご自身でお試しください。)
10回実行した結果、4.599~5.462秒で取得できて平均5.020秒でした。

次はROW_NUMBER版です。
画像のSQLを実行してみます。

ROWNUM版と同様に行番号を振って全行取得しています。
10回実行した結果、4.811~5.787秒で取得できて平均5.522秒でした。

実行結果

今回は平均処理速度が0.502秒差でROWNUM版の方が速い結果となりました。
ちなみに1000万件データでも試してみましたが2秒弱差でROWNUM版が速かったです。
SQLの見た目はごちゃっとしていますが、動きは良いようです。

ROWNUMとROW_NUMBERの使い分け

ここまでの内容から2つの使い分けに答えを出してみます。

ROWNUM
 ・少しでも処理速度を速めたい時
 ・複雑なSQLで使うと難読化やバグ発生のリスクがある

ROW_NUMBER
 ・なるだけ読みやすいSQLにしたい時
 ・膨大なデータの取得では比較的処理時間がかかる

こうしてみると基本はROW_NUMBERを使用して、
どうしても速度が気になる場合はROWNUMで書いてみるのが良さそうです。

他にも考慮できる点はあるかもしれません。
もし見つかったら続編としてまとめようと思います。