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

Oracleのより高速なオーバーラップチェック

    次のことを行うかどうかはわかりません:

    1. 挿入しようとしている行が既存の行の一部と重複していないかどうかを確認します。または
    2. 既存のすべての行を検索して、重複する行を特定しますか?

    (1)の場合、基本的にすでに行っていること...

    SELECT *
    FROM YOUR_TABLE
    WHERE :inputEnd > beginRange AND :inputStart < endRange;
    

    ...コンポーネントが反対にある複合インデックスがある場合は、オーバーラップが発生し、非常にパフォーマンスが高いはずです。 道順:{beginRange ASC, endRange DESC}

    (2)の場合、次のようなウィンドウ処理を利用できます。

    SELECT *
    FROM (
        SELECT
            YOUR_TABLE.*,
            LEAD(beginRange) OVER (ORDER BY beginRange) nextBeginRange
        FROM YOUR_TABLE
    )
    WHERE endRange > nextBeginRange;
    

    これにより、次の範囲と重複するすべての範囲が得られます(「次の」の意味は、beginRangeのコンテキストで定義されます)。 注文)。

    厳密には、これには複合インデックスも必要ありません(カバー )-{beginRange}の単純なインデックス まともなパフォーマンスを確保する必要があります。



    1. 同一のスキーマを持つ2つのデータベースをどのようにマージできますか?

    2. SQLクエリの最適化:パフォーマンスを向上させるためのベストプラクティス

    3. 特定の語順のMySQL全文

    4. テーブル内のすべての列値の個別の値を取得するSQLクエリ