sql >> Database >  >> RDS >> Oracle

Oracle snellere overlapcontrole

Ik weet niet zeker of je het volgende wilt:

  1. controleer of een rij die u gaat invoegen overlapt met enkele van de bestaande rijen, of
  2. alle bestaande rijen doorzoeken en de overlappende rijen identificeren?

Indien (1), wat doet u dan in wezen al...

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

...geeft u overlappingen en zou zeer goed moeten presteren, op voorwaarde dat u een samengestelde index heeft waarvan de componenten tegenover staan routebeschrijving:{beginRange ASC, endRange DESC} .

Indien (2), dan kunt u vensters als volgt gebruiken:

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

Dit geeft je elk bereik dat overlapt met het volgende bereik (waarbij de betekenis van "volgende" is gedefinieerd in de context van beginRange bestellen).

Strikt genomen heeft dit niet eens een samengestelde index nodig (tenzij u covering ) - gewoon een simpele index op {beginRange} moet zorgen voor behoorlijke prestaties.



  1. Een datetime-equivalent in java.sql ? (is er een java.sql.datetime?)

  2. Vind rijen met dubbele/vergelijkbare kolomwaarden MySQL

  3. PDO bindParam staat niet toe dat de instructie resultaten retourneert

  4. Euro- en dollarteken invoegen in een kolom in mysql