Что `INCLUDE` делает в индексе? - PullRequest
1 голос
/ 04 августа 2011

Что означает INCLUDE в некластеризованном индексе?

CREATE NONCLUSTERED INDEX [MyIndex] ON [dbo].[Individual] 
(
    [IndivID] ASC
)
INCLUDE ( [LastName], [FirstName]) 
WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]

Я знаю, что первая часть используется для предложения WHERE, но что делают столбцы INCLUDE?Какая польза от их «добавления к конечному уровню некластеризованного индекса»?

edit Кроме того, если у меня уже есть кластеризованный PK-индекс для IndivID, почему Tuning Advisor рекомендуетэтот индекс?

Ответы [ 4 ]

8 голосов
/ 04 августа 2011

INCLUDE столбцы включают в себя связанные поля с индексом.Они не используются для индексации FOR, но они помещаются в конечный узел B-дерева, составляющего индекс.

По сути: индекс все еще находится в состоянии ON [индивидуальный идентификатор] и [индивидуальный идентификатор].Тем не менее, если вашему запросу требуется только подмножество [IndividualID], [LastName] и [FirstName], SQL не нужно возвращаться к таблице после того, как он обнаружил [IndividualID], который он ищет в индексе.

СМ.: Индекс покрытия

РЕДАКТИРОВАТЬ: B-дерево предполагает MS SQL Server.Я не уверен, что другие реализации используют ту же структуру данных

Tuning Advisor ( Speculation ) :: Кластерный индекс помещает всю строку данных в конечный узел B-дерева индекса,и это занимает много места.Если Tuning Advisor видит, что вы никогда не получаете доступ к более чем трем полям ([IndividualID] + INCLUDEs), он попытается сэкономить ваше пространство (и время вставки / обновления), понижая его до некластерного индекса с единственным«важные» поля присутствуют.

5 голосов
/ 04 августа 2011

INCLUDE добавляет эти поля на уровне листа индекса.По сути, bt-ree не сортируется по этим полям, но как только индекс находит строку с индексированными полями, которые он ищет, он также сразу же получает другие поля.

Если вы используете телефонную книгуаналогично, поля INCLUDED в индексе телефонной книги (который сортируется по Lastname, Firstname) будут иметь значения Phone Number и Address - вы не можете искать человека по этим полям, но как только вы получитеПо их названию вы можете их найти.

CLUSTERED В индексах есть все поля, уже включенные в конструкцию, поэтому INCLUDE недопустим в CLUSTER.Вы также не должны беспокоить INCLUDE кластеризованное поле в некластеризованном индексе, поскольку оно уже неявно присутствует в качестве ключа строки.

Я чаще всего использую поля INCLUDE для агрегирования.Например, если у меня есть индекс по CalendarDate и CustomerID, я могу включить PaidAmt и получить

MAX(PAidAmt) Where CustomerId = x AND CalendarDate = 1/1/2011

На самом базовом уровне они используются, чтобы избежатьзакладка или поиск по ключу.

3 голосов
/ 04 августа 2011

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

Если, например, у вас есть запрос, который фильтрует по возрасту и имени возврата:

select name
from persons
where age = 42

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

2 голосов
/ 04 августа 2011

Из MSDN - CREATE INDEX (Transact-SQL) :

ВКЛЮЧИТЬ (столбец [, ... n])

Указывает неключевые столбцы, которые будут добавлены к конечному уровню некластеризованного индекса.

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

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