Создание индексов с включенными столбцами

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

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

Требования к свободному месту на диске

Для добавления неключевых столбцов к индексу нужно больше места на диске, чем для хранения индекса. В частности, добавление типов данных varchar(max), nvarchar(max), varbinary(max) или xml в качестве неключевых столбцов может привести к значительному увеличению требований к объему свободного места на диске, потому что значения столбцов при этом копируются на конечный уровень индекса и в то же время остаются в таблице или кластеризованном индексе.

Процесс определения требований, предъявляемых индексами с включенными столбцами к месту на диске, не отличается от процесса, выполняемого в случае некластеризованных индексов. Дополнительные сведения см. в разделе Определение требований к месту на диске для индексов.

Вопросы производительности

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

Примеры

А. Охват запроса индексом

В следующем примере создается некластеризованный индекс таблицы Person.Address, включающий четыре столбца. Ключевым столбцом индекса является PostalCode, а AddressLine1, AddressLine2, City, и StateProvinceID — неключевые столбцы.

USE AdventureWorks2008R2;
GO
CREATE NONCLUSTERED INDEX IX_Address_PostalCode
ON Person.Address (PostalCode)
INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);
GO

Следующий запрос будет охвачен индексом.

SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCode
FROM Person.Address
WHERE PostalCode BETWEEN '98000' and '99999';
GO

Б. Превышение лимита, ограничивающего размер индекса

В следующем примере при помощи предложения INCLUDE инструкции CREATE INDEX выполняется индексация столбцов, размер которых должен был бы превысить 900-байтовое ограничение размера ключевого столбца. Эти столбцы содержатся в таблице Production.ProductReview и называются ProductID(int), ReviewerName(nvarchar (50)) и Comments (nvarchar (3850)). Они часто используются в запросах, но столбец Comments слишком велик, чтобы его можно было использовать в качестве ключевого столбца индекса. Тем не менее, используя предложение INCLUDE, столбец Comments можно добавить в индекс в качестве неключевого.

USE AdventureWorks2008R2;
GO
CREATE NONCLUSTERED INDEX IX_ProductReview_ProductID_ReviewerName
ON Production.ProductReview (ProductID, ReviewerName)
INCLUDE (Comments);
GO

Следующий запрос будет охвачен этим индексом.

SELECT Comments
FROM Production.ProductReview 
WHERE ProductID = 937;
GO

Создание индекса с включенными столбцами