Tamaño máximo de las claves de índices

Al diseñar un índice que contenga varias columnas de clave o columnas de gran tamaño, debe calcular el tamaño de la clave de índice para asegurarse de que no supera el tamaño máximo permitido. SQL Server conserva el límite de 900 bytes para el tamaño máximo total de todas las columnas de clave de índice. Esto excluye las columnas sin clave incluidas en la definición de índices no clúster.

Calcular el tamaño de una clave de índice

Para calcular el tamaño de una clave de índice, siga estos pasos.

  1. Muestre las propiedades de las columnas de tabla en las que se basará el índice. Para ello, utilice la vista de catálogo sys.columns.

  2. Sume la longitud de cada columna que se definirá en la clave de índice.

    Por ejemplo, la instrucción siguiente calcula la columna max_length de la vista de catálogo sys.columns para las columnas especificadas en la tabla Person.Address.

    USE AdventureWorks2008R2;
    GO
    SELECT SUM(max_length)AS TotalIndexKeySize
    FROM sys.columns
    WHERE name IN (N'AddressLine1', N'AddressLine2', N'City', N'StateProvinceID', N'PostalCode')
    AND object_id = OBJECT_ID(N'Person.Address');
    

    Nota

    Si una columna de tabla utiliza un tipo de datos Unicode como nchar o nvarchar, la longitud de columna que se muestra es la longitud de almacenamiento de la columna. Este valor corresponde al doble del número de caracteres especificado en la instrucción CREATE TABLE. En el ejemplo anterior, City se define como un tipo de datos nvarchar(30); por tanto, la longitud de almacenamiento de la columna es 60.

  3. Si la longitud total es inferior a 900 bytes, las columnas se pueden incluir como columnas de clave de índice. Si la longitud total supera los 900 bytes, puede revisar la información siguiente para conocer otras opciones y consideraciones.

    La instrucción CREATE INDEX utiliza los siguientes algoritmos para calcular el tamaño de la clave de índice:

    • Si el tamaño de todas las columnas de clave fijas más el tamaño máximo de todas las columnas de clave variables especificadas en la instrucción CREATE INDEX es menor que 900 bytes, la instrucción CREATE INDEX finaliza correctamente sin advertencias ni errores.

    • Si el tamaño de todas las columnas de clave fijas más el tamaño máximo de todas las columnas de clave variables es mayor que 900, pero el tamaño de todas las columnas de clave fijas más el tamaño mínimo de las columnas de clave variables es menor que 900, la instrucción CREATE INDEX finaliza correctamente con una advertencia de que una instrucción INSERT o UPDATE posterior puede producir errores si especifica valores que generen un valor de clave mayor que 900 bytes. La instrucción CREATE INDEX produce errores si las filas de datos existentes en la tabla tienen valores que generan una clave mayor que 900 bytes. Una instrucción INSERT o UPDATE posterior, que especifica valores de datos que generan un valor de clave mayor que 900 bytes, produce errores.

    • La instrucción CREATE INDEX produce errores si el tamaño de todas las columnas de clave fijas más el tamaño mínimo de todas las columnas variables especificadas en la instrucción CREATE INDEX es mayor que 900 bytes.

    En la tabla siguiente se resumen los resultados de la creación de índices que cumplen o superan las restricciones de tamaño máximo de clave de índice.

Tamaño mínimo de las columnas de longitud variable + Tamaño de las columnas de datos fijos

Tamaño máximo de las columnas de longitud variable + Tamaño de las columnas de datos fijos

Máximo de la suma de las longitudes de columna de clave de índice de filas existentes*

Se crea el índice

Tipo de mensaje

Error de INSERT, UPDATE en tiempo de ejecución debido a exceso de tamaño del valor de clave de índice

> 900 bytes

No es significativo

No es significativo

No

Error

No existe ningún índice que genere este error.

<= 900 bytes

<= 900 bytes

No es significativo

Ninguno

No.

<= 900 bytes

> 900 bytes

<= 900 bytes

Advertencia

Solo si la suma de las longitudes actuales de todas las columnas de índice es mayor que 900 bytes.

<= 900 bytes

> 900 bytes

> 900 bytes

No

Error

No existe ningún índice que genere este error.

* Ninguna de las filas de la tabla en el momento de ejecutar la instrucción CREATE INDEX pueden tener valores de clave de índice con longitud total superior a 900 bytes.

Usar columnas incluidas para evitar los límites de tamaño

Puede incluir columnas sin clave en un índice no clúster para evitar las limitaciones de tamaño del índice actual de un máximo de 16 columnas de clave y un tamaño máximo de clave de índice de 900 bytes. SQL Server Database Engine (Motor de base de datos de SQL Server) no tiene en cuenta las columnas sin clave al calcular el número de columnas de clave de índice ni el tamaño total de las columnas de clave de índice. En un índice no clúster con columnas incluidas, el tamaño total de las columnas de clave de índice está limitado a 900 bytes. El tamaño total de todas las columnas sin clave solo está limitado por el tamaño de las columnas especificadas en la cláusula INCLUDE; por ejemplo, las columnas varchar(max) están limitadas a 2 GB. Las columnas de la cláusula INCLUDE puede utilizar todos los tipos de datos excepto text, ntext y image.

Nota

Cuando se crean particiones de las tablas, si las columnas de clave de creación de particiones no están aún presentes en un índice en clúster no único, el Motor de base de datos las agrega al índice. El tamaño combinado de las columnas indizadas (sin contar las columnas incluidas) más cualquier columna de creación de particiones agregada no puede superar 1800 bytes en un índice en clúster no único.