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
を配置することで回避する必要があります をサブクエリに追加します。