Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Limite della dimensione dell'indice di 900 byte nella lunghezza dei caratteri

La dimensione di archiviazione per varchar è la lunghezza effettiva dei dati inseriti + 2 byte. Anche se la colonna stessa ha un sovraccarico di 2 byte, puoi inserire fino a 900 byte di valori varchar in una colonna che viene indicizzata.

In pratica, puoi creare un indice su una colonna di dimensioni superiori a 900 byte, ma si verificherà un problema se si tenta effettivamente di inserire qualcosa di più grande di 900 byte:

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.

Tieni presente che il limite di 900 byte include tutte le colonne di una determinata chiave di indice, come mostra questo esempio:

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

Per queste colonne che normalmente sono troppo grandi per una chiave di indice, potresti ottenere alcuni vantaggi dell'indicizzazione includendole in un indice.