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 agrupados.
Calcular el tamaño de una clave de índice
Para calcular el tamaño de una clave de índice, siga estos pasos.
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.
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 AdventureWorks; 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.
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 |
Sí |
Ninguno |
No. |
<= 900 bytes |
> 900 bytes |
<= 900 bytes |
Sí |
Advertencia |
Sólo 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 agrupado 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 agrupado 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 sólo 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.