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

Oracle hurtigere overlapningskontrol

Jeg er ikke sikker på, om du vil:

  1. kontroller, om en række, du er ved at indsætte, overlapper nogle af de eksisterende rækker, eller
  2. søge gennem alle de eksisterende rækker og identificere dem, der overlapper?

Hvis (1), så gør du i det væsentlige allerede...

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

... vil give dig overlapninger og bør være meget effektiv, forudsat at du har et sammensat indeks, hvis komponenter er i modsat retninger:{beginRange ASC, endRange DESC} .

Hvis (2), så kan du bruge vinduer som dette:

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

Dette vil give dig ethvert område, der overlapper med dets næste område (hvor betydningen af ​​"næste" er defineret i sammenhæng med beginRange bestilling).

Dette kræver strengt taget ikke engang et sammensat indeks (medmindre du ønsker dækning ) - bare et simpelt indeks på {beginRange} skal sikre en anstændig ydeevne.



  1. Sådan vælger du flere rækker fra mysql med en forespørgsel og bruger dem i php

  2. Sådan implementeres en MariaDB-klynge for høj tilgængelighed

  3. 'max_user_connections' sat til 200 - får stadig fejl

  4. Lagre billede i databasen direkte eller som base64-data?