it-swarm.com.de

Begrenzung der Indexgröße auf 900 Byte in der Zeichenlänge

Wie hoch ist die maximale Zeichenanzahl für ein Indexlimit von 900 Byte in SQL Server 2012? Ich habe eine Spalte mit varchar(2000) erstellt, aber ich denke, dass sie die von SQL Server begrenzten 900 Byte überschreitet? Was wäre ein maximales varchar(?), das in die 900-Byte-Indexspalte passt?

38
iefpw

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 Spalte einfügen, die indiziert ist.

In der Praxis können Sie create einen Index für eine Spalte mit einer Größe von mehr als 900 Byte erstellen, aber Sie werden ein Problem haben, wenn Sie tatsächlich versuchen, insert etwas Größeres einzufügen 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 das Limit von 900 Byte alle Spalten eines bestimmten Indexschlüssels umfasst, wie in diesem Beispiel gezeigt wird:

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 erzielen, indem Sie einschließlich in einem Index angeben.

49
Tim Lehner

Eine weitere Option, mit der Sie versuchen können, einen Index für eine breite Spalte zu erhalten, finden Sie unter http://www.brentozar.com/archive/2013/05/indexing-wide-keys-in) -sql-server / Hier wird eine Hash-Spalte zur Tabelle hinzugefügt, indiziert und in Ihren Abfragen verwendet.

9
lmingle

Für Benutzer von SQL Server 2016 wurde die Größe des Indexschlüssels auf 1700 Byte erhöht. Neue Funktionen im Datenbankmodul - SQL Server 2016

Die maximale Indexschlüsselgröße für NICHT ABGESCHLOSSENE Indizes wurde auf 1700 Byte erhöht.

Demo:

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