Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Limite de taille d'index de 900 octets en longueur de caractères

La taille de stockage pour varchar est la longueur réelle des données saisies + 2 octets. Même si la colonne elle-même a cette surcharge de 2 octets, vous pouvez mettre jusqu'à 900 valeurs varchar octets dans une colonne qui est indexée.

En pratique, vous pouvez créer un index sur une colonne de plus de 900 octets, mais vous aurez un problème si vous essayez réellement d'insérer quelque chose de plus grand que 900 octets :

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.

Sachez que la limite de 900 octets inclut toutes les colonnes d'une clé d'index donnée, comme le montre cet exemple :

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

Pour ces colonnes qui sont normalement trop grandes pour une clé d'index, vous pourrez peut-être bénéficier de certains avantages de l'indexation en les incluant dans un index.