Não tenho certeza se você quer:
- verifique se uma linha que você está prestes a inserir se sobrepõe a algumas das linhas existentes ou
- pesquisar em todas as linhas existentes e identificar aquelas que se sobrepõem?
Se (1), então o que você essencialmente já está fazendo...
SELECT *
FROM YOUR_TABLE
WHERE :inputEnd > beginRange AND :inputStart < endRange;
...terá sobreposições e deve ter um desempenho muito bom, desde que você tenha um índice composto cujos componentes estejam em opostos direções:
{beginRange ASC, endRange DESC}
. Se (2), então você pode utilizar janelas como esta:
SELECT *
FROM (
SELECT
YOUR_TABLE.*,
LEAD(beginRange) OVER (ORDER BY beginRange) nextBeginRange
FROM YOUR_TABLE
)
WHERE endRange > nextBeginRange;
Isso lhe dará todos os intervalos que se sobrepõem ao seu próximo intervalo (onde o significado de "próximo" é definido no contexto de
beginRange
encomenda). Estritamente, isso nem precisa de um índice composto (a menos que você queira cobrindo ) - apenas um índice simples em
{beginRange}
deve garantir um desempenho decente.