Crear índices con columnas incluidas

En SQL Server 2005, un índice no clúster se puede ampliar incluyendo columnas sin clave además de las columnas de clave de índice. Las columnas sin clave se almacenan en el nivel hoja del árbol b del índice.

Los índices que incluyen columnas sin clave resultan especialmente útiles cuando abarcan la consulta. Esto significa que los índices contienen todas las columnas a las que se hace referencia en la consulta. Para obtener más información, vea Índice con columnas incluidas.

Requisitos de espacio en disco

Al agregar columnas sin clave al índice, se utiliza más espacio en disco para almacenar el índice. Concretamente, el hecho de agregar los tipos de datos varchar(max), nvarchar(max), varbinary(max) o xml como columnas sin clave puede aumentar de forma significativa los requisitos de espacio en disco, ya que los valores de las columnas se copian en el nivel hoja del índice y también permanecen en la tabla o el índice clúster.

El proceso para determinar los requisitos de espacio en disco para los índices con columnas incluidas es el mismo que el de los índices no clúster. Para obtener información, vea Determinar requisitos de espacio en disco del índice

Consideraciones de rendimiento

Las mejoras en el rendimiento se consiguen porque el optimizador de consultas puede localizar todos los datos de columnas necesarios del índice sin tener acceso a la tabla ni al índice clúster. No obstante, la presencia de un número excesivo de columnas puede aumentar el tiempo necesario para realizar operaciones de inserción, actualización o eliminación en la tabla subyacente o la vista indizada, ya que aumentará el mantenimiento del índice.

Ejemplos

A. Abarcar una consulta

En el ejemplo siguiente se crea un índice no clúster en la tabla Person.Address con cuatro columnas incluidas. La columna de clave de índice es PostalCode y las columnas sin clave son AddressLine1, AddressLine2, City, y StateProvinceID.

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

El índice abarcará esta consulta.

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

B. Superar el límite de tamaño del índice

En el ejemplo siguiente, la cláusula INCLUDE de la instrucción CREATE INDEX se utiliza para indizar columnas que normalmente superarán el límite de tamaño máximo de 900 bytes de la columna de clave. La tabla Production.ProductReview incluye las columnas ProductID(int), ReviewerName(nvarchar (50)) y Comments (nvarchar (3850)). Estas columnas se utilizan con frecuencia en consultas, pero el tamaño de la columna Comments es demasiado grande para participar como una columna de clave de índice. No obstante, la cláusula INCLUDE permite agregar la columna Comments como una columna sin clave en el índice.

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

El índice abarcará esta consulta.

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

Para crear un índice con columnas incluidas