Индексирование SQL для запроса Between только с одним соответствием?

У нас есть таблица с более чем двумя миллионами строк, где все запросы к ней будут поиском Between с использованиемColumn1 а такжеColumn2, Кроме того, будет только один возможный результат. Например...

Col1     Col2
1        5
6        10
11       15

select * from table1 where 8 between Col1 and Col2

В настоящее время у меня есть уникальный кластерный индекс наCol1 а такжеCol2, До сих пор я не мог понять, как дополнительно настроить запрос и индексы, чтобы минимизировать количество обрабатываемых строк. В плане выполнения в настоящее время сообщается о стоимости почти 0,5 и 113 тыс. Строк, обрабатываемых при поиске единственного и правильного ответа.

Какие варианты я могу пропустить?

В соответствии с просьбой, некоторые детали из текущего плана выполнения:

Operation
 Clustered Index Seek
Predicate
 CONVERT_IMPLICIT(bigint,[@2],0)
 Yoni Baciu18 окт. 2012 г., 17:20
Шаг всегда 5 в Col1? Если так, то ответ прост :)
 Rick James17 мар. 2016 г., 00:55
Какой вариант SQL вы используете?
 RBarryYoung18 окт. 2012 г., 18:51
Мммтекущий план выполнения " Вы опубликовали выглядит очень по-другому (и неправильно) по сравнению с примером запроса SQL, который вы опубликовали. Не могли бы вы опубликовать свой фактический код SQL, потому что что-тоздесь не так.
 RBarryYoung18 окт. 2012 г., 20:11
Ой, подожди, я неНе замечаю, что два предиката противоположны друг другу, мой плохой. Извини, неважно.
 RBarryYoung18 окт. 2012 г., 20:09
Опять же, пожалуйста, опубликуйте его, потому что в соответствии с вашим опубликованным планом выполнения (который, я полагаю, был вырезан и вставлен)Что-то не так с этим.
 Vicki18 окт. 2012 г., 17:13
Поможет ли это написатьвыберите * из таблицы 1, где Col1 = < 8 и Col2>= 8'
 Rick James17 мар. 2016 г., 00:58
Этот вопрос практически дубликатstackoverflow.com/questions/36029086/...
 Dave Simione18 окт. 2012 г., 18:11
Какие типы данных Column1 и Column2? И как значение 8 вводится в запрос (параметр, жестко закодировано и т. Д.)?
 Mikael Eriksson18 окт. 2012 г., 17:30
Как выглядит ваш план выполнения? Не могли бы вы добавить это к вопросу?
 PatrickPL18 окт. 2012 г., 19:50
Помимо имен таблиц и столбцов, это 'с тем же запросом. Типы данных для Col1 и Col2 - BigInt.

Ответы на вопрос(3)

Решение Вопроса

Я думаю, что нашел ответ. Мне пришлось начать с создания уникального кластеризованного индекса на Col1, а затем создать уникальный некластеризованный индекс на Col2. Затем запрос должен быть обновлен, чтобы вызвать поиск по каждому индексу.

select * from table1 where Col1 = 
    (select max(Col1) from table1 where Col1 = 8)

План выполнения теперь сообщает 0,0098 стоимости и 1 строка обработана.

select * from table1 where Col1 = 8

Может быть, "между" с двумя столбцами вызывает проблему.

Кроме того, у вас должен быть только 1 составной индекс для обоих столбцов (Col1, Col2).

Всегда ли диапазоны не перекрываются? Вы упоминаете, что всегда есть только один матч. Если они есть, вы можете написать это как:

SELECT * FROM table1 
   WHERE 8 

Ваш ответ на вопрос