Индекс SQL - оба оператора будут делать то же самое? - PullRequest
1 голос
/ 06 июня 2019

Мне было интересно, будут ли эти два оператора для создания некластеризованного индекса вести себя одинаково?

create nonclustered index EmpLastname_Incl_Firstname 
on employee(lastname) include (firstname);

create nonclustered index EmpLastnameFirstname 
on employee(lastname, firstname)

Ответы [ 4 ]

3 голосов
/ 06 июня 2019

Нет.Ключевые столбцы оптимизированы для таких вещей, как фильтрация и группировка, а включенные столбцы оптимизированы только для извлечения столбца.Таким образом, если многие ваши запросы выглядят следующим образом:

SELECT firstname, lastname
FROM mytable
WHERE lastname = 'Doe' AND firstname = 'John'

, тогда второй показанный вами индекс будет предпочтительным.Если вы используете lastname в вашем SELECT, например в следующем запросе:

SELECT firstname, lastname
FROM mytable
WHERE lastname = 'Doe'

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

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

1 голос
/ 06 июня 2019

Эти утверждения не будут иметь такого же поведения.Индекс с включенным разрешает только поиск ключей в поле фамилии, в то время как индекс без включающего разрешает поиск ключа как в полях фамилия, так и имя. Документация Microsoft для индексов с включением .Этот бит особенно важен для вашего вопроса:

Перепроектировать некластеризованные индексы с большим размером ключа индекса, чтобы только столбцы, используемые для поиска и поиска, были ключевыми столбцами.Сделайте все другие столбцы, которые покрывают запрос, в неключевые столбцы.Таким образом, у вас будут все столбцы, необходимые для покрытия запроса, но сам индексный ключ небольшой и эффективный.

Если вам когда-нибудь понадобится выполнить поиск по полю имени, ваш индекс должен включать егов качестве ключевого поиска.

1 голос
/ 06 июня 2019

абсолютно нет

ВКЛЮЧИТЬ означает, что данные из столбца хранятся в индексе, но не являются частью сортировки индекса

0 голосов
/ 11 июня 2019

При добавлении столбцов к include соответствующие данные будут храниться только на уровне конечных узлов b-дерева (не в самом дереве).

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

С учетом вышесказанного есть некоторые преимущества при добавлении столбца в include вместо ключевой части:

  • результирующий индекс немного меньше (на несколько процентов)
  • Дерево индекса может быть на один уровень меньше
  • Документировано, что столбец этогоИндекс используется для.Это делает расширение этого индекса более простым в будущем.

Я считаю последний наиболее важным.

Посмотрите мою недавнюю статью на эту тему для лучшего понимания.: https://use -the-index-luke.com / blog / 2019-04 / include-columns-in-btree-indexes

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