2015-02-16 3 views
0

У меня есть таблица под названием Range. Который имеет начало и конец диапазона. Я хочу знать, каковы диапазоны в таблице Range, которые перекрываются с заданным диапазоном.Найти все диапазоны, перекрывающиеся с заданным диапазоном

For Ex - 
Range Table 
RId Start End 
1  1 2 
2  3 5 
3  10 20 
4  6 8 

Given range : 2-8 

Затем я должен вернуть Rids перекрывающихся диапазонов, т.е. 1,2,4.

У меня есть решение для этого, которое работает. Но я ищу оптимизацию производительности.

Range Table size = 680 million rows 
Start and End are BIGINT type. 

This is an extension of 
http://stackoverflow.com/questions/27580384/range-queries-on-2-columns 

Here result may be more 1 rows 

Edited -

Here is my current solution - 

CREATE TABLE #Range 
(
RID int, 
StartR BIGINT, 
EndR BIGINT) 

INSERT INTO #Range 
SELECT 1,  1 , 2 UNION ALL 
SELECT 2,  3, 5 UNION ALL 
SELECT 3,  10, 20 UNION ALL 
SELECT 4,  6, 8 

DECLARE @s BIGINT = 2, @e BIGINT = 8 


SELECT 
    RId 
FROM #Range 
WHERE 
    @e >= StartR 
    AND EndR >= @s 

Я создал 2 отдельных индексов на Start и End и один на старте и End.

+1

Просьба указать ваше рабочее решение. –

+0

Было бы лучше, если бы вы дали нам код, который используете - иначе как мы узнаем, если он/не является оптимальным? Также вы ссылаетесь на другой вопрос по SE, но это включает две таблицы. Вы только заботитесь об оптимизации этой части? – Turophile

+0

Почему -1 для вопроса? –

ответ

1

Вы можете использовать запрос ff для получения перекрывающихся диапазонов.

SELECT 
    * 
FROM #Range 
WHERE 
    @e >= StartR 
    AND EndR >= @s 

Необходимо, скорее всего, добавить указатель на (StartR, EndR).

CREATE NONCLUSTERED INDEX NCIX_Range ON #Range(StartR,EndR) 
+0

Он выполняет то же, что и решение. –

+1

@JitendraRathor, но ваши решения не будут покрывать все возможности –

+0

@ t-clausen.dk Да, это так. Спасибо за указание. –

Смежные вопросы