В каком случае SQL будет использовать индекс таблицы - PullRequest
1 голос
/ 30 апреля 2020

Во время интервью мне задали странный вопрос. Я не смог найти правильный ответ на него, поэтому размещаю вопрос ниже:

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

a) выберите * из Stud_Details, где Stud_Name как 'A%'

b) выберите * из Stud_Details, где Stud_Name как '% A'.

c) выберите * из Stud_Details, где Stud_Name не похож на 'A%'

. В таком случае сервер SQL будет использовать индекс, который я создал для Stud_Name?

PS: Если это вопрос кажется идиотизм c не сердитесь на меня, сердитесь на интервьюера, который спросил меня об этом. Также у меня нет никакой информации относительно того, как был создан индекс. Эта информация выше - все, что у меня есть.

1 Ответ

3 голосов
/ 30 апреля 2020

В каких случаях может SQL Сервер использует индекс для Stud_Name?

  • Опция (a) является единственной, которая может использоваться в индексе seek . like 'A%' можно преобразовать в поиск диапазона по >= A и <B

  • Опция (b) не может использовать поиск по индексу, так как ведущий подстановочный знак предотвращает это. Хотя он все еще может сканировать индекс.

  • Опция (c) теоретически может быть преобразована в два поиска диапазона (< 'A' OR >= 'B', но я только что проверил и SQL Сервер не делает этого (даже в тех случаях, когда это приведет к удалению 100% таблицы и с подсказкой FORCESEEK). Опять же, он может сканировать индекс.

In в каких случаях будет SQL Сервер будет использовать индекс для Stud_Name?

Это зависит от оценок количества элементов и от того, покрывает ли индекс индекс, а также от относительной ширины строк индекса по сравнению с строки базовой таблицы.

Предполагая, что индекс не покрывает, тогда любые найденные строки, которые соответствуют предложению WHERE, будут нуждаться в поисках для извлечения значений столбца. Чем больше число предполагаемых поисков, тем меньше вероятность того, что не будет покрытия Индекс должен быть использован.

Для b + c выбор - сканирование индекса + поиск по сравнению с сканированием таблицы без поиска. Преимущество выполнения сканирования индекса будет выше, если индекс намного уже, чем стол. Если они схожи по размеру, IO вряд ли выиграет от чтения индекса, а не таблицы в первую очередь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...