Crear índices con columnas incluidas
En SQL Server 2005, un índice no agrupado 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 agrupado.
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 agrupados. 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 agrupado. 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 agrupado 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 AdventureWorks;
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 AdventureWorks;
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
Vea también
Conceptos
Crear índices no agrupados
Directrices generales para diseñar índices