Oracle
 sql >> Database >  >> RDS >> Oracle

Controllo di sovrapposizione più rapido Oracle

Non sono sicuro che tu voglia:

  1. controlla se una riga che stai per inserire si sovrappone ad alcune righe esistenti, oppure
  2. cerca in tutte le righe esistenti e identifica quelle che si sovrappongono?

Se (1), allora cosa stai già facendo essenzialmente...

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

...ti darà sovrapposizioni e dovrebbe essere molto performante, a condizione che tu abbia un indice composito i cui componenti siano in opposto indicazioni:{beginRange ASC, endRange DESC} .

Se (2), puoi utilizzare il windowing in questo modo:

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

Questo ti darà ogni intervallo che si sovrappone al suo intervallo successivo (dove il significato di "next" è definito nel contesto di beginRange ordinazione).

A rigor di termini, questo non ha nemmeno bisogno di un indice composito (a meno che tu non voglia copertura ) - solo un semplice indice su {beginRange} dovrebbe garantire prestazioni decenti.