Oracle
 sql >> Base de données >  >> RDS >> Oracle

Contrôle de chevauchement plus rapide d'Oracle

Je ne sais pas si vous voulez :

  1. vérifiez si une ligne que vous êtes sur le point d'insérer chevauche certaines des lignes existantes, ou
  2. rechercher dans toutes les lignes existantes et identifier celles qui se chevauchent ?

Si (1), alors ce que vous faites essentiellement déjà...

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

... vous donnera des chevauchements et devrait être très performant, à condition que vous disposiez d'un index composite dont les composants sont opposés instructions :{beginRange ASC, endRange DESC} .

Si (2), alors vous pouvez utiliser le fenêtrage comme ceci :

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

Cela vous donnera chaque plage qui chevauche sa prochaine plage (où la signification de "next" est définie dans le contexte de beginRange commande).

Strictement, cela n'a même pas besoin d'un index composite (sauf si vous voulez couvrant ) - juste un simple index sur {beginRange} devrait garantir des performances décentes.