Создание индексов с включенными столбцами
Некластеризованный индекс можно расширить, включив в него, помимо ключевых столбцов индекса, и неключевые столбцы. Неключевые столбцы хранятся на конечном уровне сбалансированного дерева индекса.
Индексы, включающие неключевые столбцы, обеспечивают максимальную выгоду, если они охватывают запрос. Это означает, что индексы включают все столбцы, указанные в запросе. Дополнительные сведения см. в разделе Индекс с включенными столбцами.
Требования к свободному месту на диске
Для добавления неключевых столбцов к индексу нужно больше места на диске, чем для хранения индекса. В частности, добавление типов данных 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
Создание индекса с включенными столбцами
См. также