Это зависит от вашего запроса. Если вы запрашиваете только эти два значения, например ::100100
SELECT StartNum, EndNum
FROM Books
WHERE (@Num >= StartNum) AND (@Num <= EndNum)
В этом случае SQL Server должен только выполнить поиск по двум индексам для возврата чисел. Два ваших индекса содержат значение, которое вы проиндексировали, и, поскольку это индекс, они отсортированы.
Но я уверен, что вы включили в свой запрос другие столбцы:
SELECT BookID, Title, IDBN, Author, StartNum, EndNum
FROM Books
WHERE (@Num >= StartNum) AND (@Num <= EndNum)
В этом случае SQL Server, как только он обнаружит id строк, соответствующих критериям, должен затем вернуться в базу данных и найти эти строки, чтобы он мог вернуть вам :
в дополнение к уже имеющимся значениям из двух индексов:
Примечание: Индекс в StartNum неявно содержит значение кластеризованного ключа, поскольку именно так он знает, какая строка соответствует записи в индексе.
Проблема в том, что если в таблице «слишком много книг», которые нужно просмотреть, то может быть быстрее прочитать всю таблицу сверху вниз.
Аналогия: Вы просматриваете в указателе книги все ссылки на "шаблоны проектирования".
шаблоны дизайна: 4, 89, 221, 442
Если есть только 4 записи, то все будет в порядке, если вы переместитесь назад на страницу, указанную в индексе. Это называется поиск закладок .
Но что, если в индексе указано 827 ссылок на фразу?
компьютер: 1, 2, 6, [отрывок 825 записей], 1087, 1128
Тогда может быть быстрее прочитать книгу, чтобы найти их самостоятельно. В этом случае мы сдаемся и сканируем всю книгу. SQL Server называет это сканированием кластеризованного индекса , если таблица имеет кластеризованный индекс, или сканирование таблицы , если нет кластеризованного индекса (то есть это «таблица кучи»)
Если вы просто ссылались на StartNum и EndNum в своем запросе (скажем, вы получили счетчик), то я уверен, что вы увидите постоянно низкое число операций чтения и выполнения раз. Но если вы включите другие столбцы, и SQL Server считает, что из этого запроса будет возвращено слишком много строк (например, более 5% таблицы), он просто забудет индекс и просканирует весь таблица.
Существует точка пересечения, в которой SQL Server знает распределение значений StartNum и EndNum в вашей таблице, поскольку он выбирает значения и имеет статистику их распределения. Если случится, что некоторые значения @Num вернут несколько строк, и SQL Server это знает, он выполнит сравнительно небольшое количество поиска закладок . Но если ваше распределение данных приведет к возвращению большего количества строк, то вы получите сканирование кластерного индекса .