質問: 注文後にoracleクエリから返される行数を制限するにはどうすればよいですか? oracleクエリをmysql limit句を含むように動作させる方法はありますか?mysqlでは、これを行うことができます。select * from sometable order by name limit 20,10 21行目から30行目までを取得します(最初の20行をスキップし、次の10行を指定します)。行はorder byの後で選択されるので、実際にはアルファベット順で20番目の名前から始まります。oracleでは、人々が言及するのはrownum疑似列だけですが、の前にorder byが評価されます。select * from sometable where rownum <= 10 order by name 名前順に並べられた10行のランダムなセットを返します。これは通常私が望むものではありません。オフセットを指定することもできません。
回答: 私は以下の方法でパフォーマンステストを行いました。アスクトムselect * from ( select a.*, rownum rnum from ( <select statement with order by clause> ) a where rownum <= max_row ) where rnum >= min_row 分析的select * from ( <select statement with order by clause> ) where myrow between min_row and max_row ショートオルタナティブselect * from ( select statement, rownum as rn with order by clause ) where a.rn >= min_row and a.rn <= max_row 結果テーブルには1000万件のレコードがあり、ソートはインデックスのないdatetime行にあります。 explain planは3つの選択すべてに対して同じ値を示しました(323168) しかし勝者はasktomです(分析的なフォローはすぐ後ろにあります) 最初の10行を選択すると asktom:28-30秒 分析:33〜37秒 短い選択肢:110〜140秒 100,000から100,010までの行を選択します。 asktom:60秒 分析:100秒 9,000,000〜9,000,010の行を選択します。 asktom:130秒 分析:150秒