Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

900-Byte-Indexgrößenbeschränkung in Zeichenlänge

Die Speichergröße für varchar ist die tatsächliche Länge der eingegebenen Daten + 2 Bytes. Obwohl die Spalte selbst diesen 2-Byte-Overhead hat, können Sie bis zu 900 Byte-Varchar-Werte in eine indexierte Spalte einfügen.

In der Praxis können Sie erstellen einen Index für eine Spalte, die größer als 900 Byte ist, aber Sie werden ein Problem haben, wenn Sie tatsächlich versuchen, einzufügen etwas größer als 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.

Beachten Sie, dass die 900-Byte-Grenze alle Spalten eines bestimmten Indexschlüssels umfasst, wie dieses Beispiel zeigt:

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

Für diese Spalten, die normalerweise zu groß für einen Indexschlüssel sind, können Sie möglicherweise einige Vorteile der Indizierung nutzen, indem Sie sie in einen Index aufnehmen.