私が言うなら:
select * from table order by col1 where rownum < 100
テーブルに 1,000 万件のレコードがある場合、Oracle は 1,000 万件すべてを取得し、並べ替えてから最初の 10 件を表示しますか? または、それを最適化する方法はありますか?
私が言うなら:
select * from table order by col1 where rownum < 100
テーブルに 1,000 万件のレコードがある場合、Oracle は 1,000 万件すべてを取得し、並べ替えてから最初の 10 件を表示しますか? または、それを最適化する方法はありますか?
こうすれば
select * from table order by col1 where rownum < 100
この場合、WHERE 句が ORDER BY の前にあるため、Oracle はエラーをスローします。
こうすれば
select * from table where rownum < 100 order by col1
WHERE 句が ORDER BY の前にあるため、Oracle はランダムな 99 レコードを返します。
最初の 100 件のレコードを列で並べ替えて返す場合は、サブセレクトで順序を指定する必要があります。
select *
from ( select * from table order by col1 )
where rownum <= 100
オラクルはソートを行いますが、他にどのようにして必要なレコードを知ることができますか? ただし、ROWNUMのため、ストップキーでのソートになります。内部で最適化が行われるため、 Oracle は実際には結果セット全体をソートしませんが、これは想定できることです。
Tom Kyte によるこの記事を参照してください。