ROW_NUMBER Oracleでは非常に非効率的です 。
パフォーマンスの詳細については、ブログの記事を参照してください:
- Oracle:ROW_NUMBERとROWNUM
特定のクエリについては、ROWNUMに置き換えることをお勧めします インデックスが使用されていることを確認してください:
SELECT *
FROM (
SELECT /*+ INDEX_ASC(t index_on_column) NOPARALLEL_INDEX(t index_on_column) */
t.*, ROWNUM AS rn
FROM table t
ORDER BY
column
)
WHERE rn >= :start
AND rownum <= :end - :start + 1
このクエリはCOUNT STOPKEYを使用します
また、必ずcolumn null許容ではないか、WHERE column IS NOT NULLを追加します 状態。
そうしないと、インデックスを使用してすべての値を取得できません。
ROWNUM BETWEEN :start and :endは使用できないことに注意してください サブクエリなし。
ROWNUM 常に最後に割り当てられ、最後にチェックされます。これがROWNUMの方法です。 は常に隙間なく順番に並んでいます。
ROWNUM BETWEEN 10 and 20を使用する場合 、他のすべての条件を満たす最初の行は、一時的にROWNUM = 1が割り当てられて、戻る候補になります。 ROWNUM BETWEEN 10 AND 20のテストに失敗します 。
次に、次の行が候補になり、ROWNUM = 1が割り当てられます。 失敗するなど、最終的には行がまったく返されません。
これは、ROWNUMを配置することで回避する必要があります をサブクエリに追加します。