sql >> データベース >  >> RDS >> Oracle

Oracleでrow_numberを高速化するにはどうすればよいですか?

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



    1. SQL Server Management Studio(SSMS)でクエリ結果を.csvまたはタブ区切りファイルにエクスポートする方法-SQL Server/TSQLチュートリアルパート23

    2. SQL Serverとは何ですか?

    3. SQL Server Management Studio(SSMS)でオブジェクトをフィルタリングする方法-SQL Server/TSQLチュートリアルパート19

    4. レーベンシュタイン:MySQL + PHP