sql >> Base de Datos >  >> RDS >> Sqlserver

Límite de tamaño de índice de 900 bytes en longitud de caracteres

El tamaño de almacenamiento para varchar es la longitud real de los datos ingresados ​​+ 2 bytes. Aunque la columna en sí tiene esa sobrecarga de 2 bytes, puede colocar valores varchar de hasta 900 bytes en una columna indexada.

En la práctica, puede crear un índice en una columna de más de 900 bytes de tamaño, pero tendrá un problema si realmente intenta insertar algo más grande que 900 bytes:

create table test (
    col varchar(1000)
);
create index test_index on test (col);
-- Warning! The maximum key length is 900 bytes. The index 'test_index' has maximum length of 1000 bytes. For some combination of large values, the insert/update operation will fail.
insert into test select cast(replicate('x', 899) as varchar(1000)); -- Success
insert into test select cast(replicate('y', 900) as varchar(1000)); -- Success
insert into test select cast(replicate('z', 901) as varchar(1000)); -- Fail
-- Msg 1946, Level 16, State 3, Line 8
-- Operation failed. The index entry of length 901 bytes for the index 'test_index' exceeds the maximum length of 900 bytes.

Tenga en cuenta que el límite de 900 bytes incluye todas las columnas de una clave de índice dada, como muestra este ejemplo:

create table test (
      col varchar(1000)
    , otherCol bit -- This column will take a byte out of the index below, pun intended
);
create index test_index on test (col, otherCol);
insert into test select cast(replicate('x', 899) as varchar(1000)), 0; -- Success
insert into test select cast(replicate('y', 900) as varchar(1000)), 0; -- Fail
insert into test select cast(replicate('z', 901) as varchar(1000)), 0; -- Fail

Para estas columnas que normalmente son demasiado grandes para una clave de índice, puede obtener algunos beneficios de la indexación al incluirlas en un índice.