Jag är inte säker på om du vill:
- kontrollera om en rad som du ska infoga överlappar några av de befintliga raderna, eller
- söka igenom alla befintliga rader och identifiera de som överlappar?
Om (1), vad du i princip redan gör...
SELECT *
FROM YOUR_TABLE
WHERE :inputEnd > beginRange AND :inputStart < endRange;
...ger dig överlappningar och bör vara mycket presterande, förutsatt att du har ett sammansatt index vars komponenter är motsatta vägbeskrivning:{beginRange ASC, endRange DESC}
.
Om (2) kan du använda fönster så här:
SELECT *
FROM (
SELECT
YOUR_TABLE.*,
LEAD(beginRange) OVER (ORDER BY beginRange) nextBeginRange
FROM YOUR_TABLE
)
WHERE endRange > nextBeginRange;
Detta ger dig alla intervall som överlappar med nästa intervall (där betydelsen av "nästa" definieras i sammanhanget beginRange
beställning).
Det här kräver strikt sett inte ens ett sammansatt index (såvida du inte vill ha täckning
) - bara ett enkelt index på {beginRange}
bör säkerställa anständig prestanda.