Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle schnellere Überlappungsprüfung

Ich bin mir nicht sicher, ob Sie Folgendes tun möchten:

  1. überprüfen Sie, ob sich eine Zeile, die Sie einfügen möchten, mit einigen der vorhandenen Zeilen überschneidet, oder
  2. Alle vorhandenen Zeilen durchsuchen und diejenigen identifizieren, die sich überschneiden?

Wenn (1), dann tun Sie im Grunde schon...

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

... ergibt Überschneidungen und sollte sehr performant sein, vorausgesetzt, Sie haben einen zusammengesetzten Index, dessen Komponenten gegensätzlich sind Richtungen:{beginRange ASC, endRange DESC} .

Wenn (2), dann können Sie Fenster wie folgt verwenden:

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

Dadurch erhalten Sie jeden Bereich, der sich mit seinem nächsten Bereich überschneidet (wobei die Bedeutung von „nächster“ im Kontext von beginRange definiert ist Bestellung).

Streng genommen benötigt dies nicht einmal einen zusammengesetzten Index (es sei denn, Sie möchten deckt ) - nur ein einfacher Index auf {beginRange} sollte eine anständige Leistung gewährleisten.