sql >> Databáze >  >> RDS >> Oracle

Oracle rychlejší kontrola překrývání

Nejsem si jistý, zda chcete:

  1. zkontrolujte, zda se řádek, který se chystáte vložit, nepřekrývá s některými ze stávajících řádků, nebo
  2. prohledejte všechny existující řádky a identifikujte ty, které se překrývají?

Pokud (1), pak to, co v podstatě již děláte...

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

...poskytne vám přesahy a měl by být velmi výkonný za předpokladu, že máte složený index, jehož složky jsou opačně směry:{beginRange ASC, endRange DESC} .

Pokud (2), pak můžete použít okno takto:

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

Získáte tak každý rozsah, který se překrývá s jeho dalším rozsahem (kde význam „další“ je definován v kontextu beginRange objednávání).

Přísně to ani nepotřebuje složený index (pokud nechcete krytí ) - jen jednoduchý index na {beginRange} by měl zajistit slušný výkon.



  1. Laravel Raw DB Vložit ovlivněné řádky

  2. Vytvoření a odstranění databáze PostgreSQL na Ubuntu 16.04

  3. Typ záznamu dotazu Oracle Dynamic 'SQL select'

  4. Napište Postgres Get nebo Create SQL Query