Поскольку индексы хранятся в двоичной древовидной структуре (отсортированной, а не хеш), механизм может приравнять диапазон предложения where к диапазону индексов путем поиска в двух местах.
Однако иногда механизм может выбрать сканирование всего индекса, даже если указанный диапазон приводит к извлечению только нескольких записей. План объяснения должен показывать, был ли для запроса выбран поиск индекса или сканирование индекса.
В качестве примера, может быть низкая производительность при запросе диапазона выбора, который возвращает небольшое количество <10 записей из таблицы строк с миллионами с индексом (бывает некластеризованным, но не точкой) в диапазоне значений ( индекс v1 + v2): </p>
select * from
tbl t
where t.v1 = 123
and t.v2 < 4;
Поскольку поиск по индексу, вероятно, является лучшим выбором для этого случая (малый набор возвращаемых значений), его можно указать с помощью «with (forceseek)».
select *
from tbl t with (forceseek) -- is 6x faster for this case
where t.v1 = 123
and t.v2 < 4;
В идеале было бы неплохо, если бы двигатель принимал более разумное решение без силы, возможно, выполняя поиск и подсчитывая записи, особенно когда размер таблицы велик.