Индексы с включенными столбцами или составные индексы - PullRequest
2 голосов
/ 02 марта 2011

Глядя на отсутствующие индексные DMV на SQLServer, я предлагаю добавить следующий индекс:

CREATE INDEX [IXFoo] ON [a].[b].[MyTable] ([BarFlag]) INCLUDE ([BazID])

Меня смущают две вещи.

  • [BarFlag] это битовое поле.Едва ли сильно избирателен, зачем ставить индекс в битовое поле?
  • Почему бы не использовать составной индекс в этом случае .: CREATE INDEX [IXFoo] ON [a].[b].[MyTable] ([BarFlag],[BazID])

Я думаю, я не понимаюINCLUDE ключевое слово правильно.Я посмотрел на msdn для объяснения, но мне все еще неясно.

Может кто-нибудь объяснить, почему этот индекс предлагается для составного, и объяснить мне ключевое слово INCLUDE?

Ответы [ 2 ]

4 голосов
/ 02 марта 2011

Основное различие заключается в следующем:

  • если вы создадите составной индекс на (BarFlag, BazID), тогда ваш индекс будет содержать оба значения на всех уровнях b-дерева индекса;это означает, что анализатор запросов также будет иметь возможность использовать оба значения при принятии решений, и это может поддерживать запросы, которые указывают оба столбца в предложении WHERE

  • , если вы создаете индекс для(BarFlag) и только включать (BazID), тогда ваш индекс будет содержать только BarFlag значения на всех уровнях b-дерева индекса, и только на уровне листа, на «последнем» уровне, также будут значенияBazID включено.Значения BazID не могут использоваться при выборе данных - они просто присутствуют на уровне листа индекса для поиска.

Только для INT и BIT, которые не оченьчто вызывает беспокойство, но если вы имеете дело со столбцом VARCHAR(2000), вы не можете добавить это к фактическому индексу (макс. 900 байт на запись) - но вы можете включите его.

Наличие столбца, включенного в индекс, может быть полезным, если вы выберете эти два значения - тогда, если SQL Server найдет совпадение для BarFlag, он может найти соответствующее значение BazID вузел конечного уровня самого индекса, и он может сохранить себе возвращение к реальной странице данных («поиск по закладкам»), чтобы получить это значение со страниц данных.Это может значительно повысить производительность

И вы правы - иметь индекс только на BarFlag (BIT) действительно не имеет смысла - опять же, что DMV предлагает только индексы - выне следует слепо следовать всем его рекомендациям - вам все равно нужно подумать и подумать, если это хорошие рекомендации (или нет).

2 голосов
/ 02 марта 2011

Ключевое слово INCLUDE просто означает, что значение включенных столбцов должно храниться в самом индексе, чтобы для запросов, подобных следующему:

SELECT BazID FROM MyTable WHERE BarFlag = @SomeValue

Нет необходимости делать дополнительныепоиск в самой таблице, чтобы найти значение BazID после выполнения поиска по индексу.

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