Основное различие заключается в следующем:
если вы создадите составной индекс на (BarFlag, BazID)
, тогда ваш индекс будет содержать оба значения на всех уровнях b-дерева индекса;это означает, что анализатор запросов также будет иметь возможность использовать оба значения при принятии решений, и это может поддерживать запросы, которые указывают оба столбца в предложении WHERE
, если вы создаете индекс для(BarFlag)
и только включать (BazID)
, тогда ваш индекс будет содержать только BarFlag
значения на всех уровнях b-дерева индекса, и только на уровне листа, на «последнем» уровне, также будут значенияBazID
включено.Значения BazID
не могут использоваться при выборе данных - они просто присутствуют на уровне листа индекса для поиска.
Только для INT и BIT, которые не оченьчто вызывает беспокойство, но если вы имеете дело со столбцом VARCHAR(2000)
, вы не можете добавить это к фактическому индексу (макс. 900 байт на запись) - но вы можете включите его.
Наличие столбца, включенного в индекс, может быть полезным, если вы выберете эти два значения - тогда, если SQL Server найдет совпадение для BarFlag
, он может найти соответствующее значение BazID
вузел конечного уровня самого индекса, и он может сохранить себе возвращение к реальной странице данных («поиск по закладкам»), чтобы получить это значение со страниц данных.Это может значительно повысить производительность
И вы правы - иметь индекс только на BarFlag
(BIT) действительно не имеет смысла - опять же, что DMV предлагает только индексы - выне следует слепо следовать всем его рекомендациям - вам все равно нужно подумать и подумать, если это хорошие рекомендации (или нет).