web-dev-qa-db-fra.com

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

Quelle est la limite totale de caractères pour une limite d'index de 900 octets que SQL Server 2012 a. J'ai créé une colonne qui a varchar(2000), mais je pense qu'elle dépasse les 900 octets que SQL Server limite? Quelle serait une max varchar(?) pour tenir dans la colonne d'index de 900 octets?

38
iefpw

La taille de stockage pour varchar est la longueur réelle des données entrées + 2 octets. Même si la colonne elle-même a cette surcharge de 2 octets, vous pouvez mettre jusqu'à 900 octets valeurs varchar 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 de insérer quelque chose de plus de 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 y compris dans un index.

49
Tim Lehner

Sur une note connexe, une autre option que vous pouvez essayer, pour obtenir un index sur une large colonne, est décrite à http://www.brentozar.com/archive/2013/05/indexing-wide-keys-in -sql-server / où une colonne de hachage est ajoutée à la table puis indexée et utilisée dans vos requêtes.

9
lmingle

Pour ceux sur SQLServer 2016, la taille de la clé d'index a été augmentée à 1700 octets .. Nouveautés du moteur de base de données - SQL Server 2016

La taille de clé d'index maximale pour les index NONCLUSTERED a été augmentée à 1700 octets.

Démo:

create table test
(
id varchar(800),
id1 varchar(900)
)

insert into test
select replicate('a',800),replicate('b',900)

create index nci on test(id,id1)
6
TheGameiswar