it-swarm.com.de

Das Erstellen eines Index für eine varchar (1024) -Spalte war erfolgreich. Funktioniert es?

Beim Erstellen eines Index für eine varchar (1024) -Spalte mithilfe der SSMS-GUI ist Folgendes fehlgeschlagen:

"Warning! The maximum key length is 900 bytes. The index 'XXX' has maximum length of 1024 bytes. For some combination of large values, the insert/update operation will fail." 

Der gleiche Vorgang war jedoch erfolgreich, als ich SQL (nicht GUI) verwendete. Ich bin nicht sicher, warum dies passiert ist, aber bedeutet dies, dass der Index funktioniert, bis die Daten über 900 Bytes wirklich in die Spalte eingefügt werden?

(Die Spalte hat derzeit keinen Wert über 900 Byte.)

umgebung: - SQL Server 2012 - Windows Server 2008 R2 SP1

6
yobioo

Alle Versionen

Wenn Sie einen Index für eine Spalte erstellen, deren Definition länger als 900 oder 1700 ist (abhängig von Version und Art des Index), erhalten Sie entweder eine Warnung und die Indexerstellung ist erfolgreich (wenn die Tabelle leer ist oder die vorhandenen Daten nicht so lang sind) oder ein Fehler und die Indexerstellung schlägt fehl (wenn eine Zeile oder mehr den Grenzwert überschreitet).

Für den Warnfall sind die Grenzen:

SQL Server 2014 und älter

Wenn Sie einen Clustered-Index für eine varchar(>900) - Spalte erstellen, erhalten Sie beim Erstellen des Index eine Warnung.

Wenn Sie einen nicht gruppierten Index für eine varchar(>900) - Spalte erstellen, erhalten Sie beim Erstellen des Index eine Warnmeldung.

SQL Server 2016 und neuer

Wenn Sie einen Clustered-Index für eine varchar(>900) -Spalte erstellen, erhalten Sie beim Erstellen des Index eine Warnmeldung.

Wenn Sie einen nicht gruppierten Index für eine varchar(>1700) - Spalte erstellen, erhalten Sie beim Erstellen des Index eine Warnmeldung.

Daten einfügen

Wenn Sie nicht mehr Daten einfügen, als durch den Index und die Version von SQL Server begrenzt ist, wird in Ihrer Anwendung/SSMS/SQL Query/... keine Fehlermeldung angezeigt.

Das Einfügen von mehr als den durch die Version und den Indextyp angegebenen Grenzwerten führt jedoch zu einer Fehlermeldung.

Testen

Sie können dies unter db <> fiddle ausprobieren. Die Links für jeden Test finden Sie unter den Testbeispielen.

Varchar Non-Clustered Index-Einschränkungen unter SQL Server 2012

CREATE TABLE VarcharNonClustered
(
  ID INT
  ,Name VARCHAR(2000)
)

GO
CREATE NONCLUSTERED INDEX idx_VarcharNonClustered_Name ON VarcharNonClustered(Name)
GO
 ✓ 
 
 Warnung! Die maximale Schlüssellänge beträgt 900 Byte. Der Index 'idx_VarcharNonClustered_Name' hat eine maximale Länge von 2000 Bytes. Bei einer Kombination großer Werte schlägt der Einfüge-/Aktualisierungsvorgang fehl. 
INSERT INTO VarcharNonClustered 
VALUES (1,REPLICATE('a',1701))
GO
 Msg 1946 Level 16 State 3 Line 1 
 Operation fehlgeschlagen. Der Indexeintrag mit einer Länge von 1701 Byte für den Index 'idx_VarcharNonClustered_Name' überschreitet die maximale Länge von 900 Byte. 
INSERT INTO VarcharNonClustered 
VALUES (1,REPLICATE('a',1700))
GO
 Msg 1946 Level 16 State 3 Line 1 
 Operation fehlgeschlagen. Der Indexeintrag mit einer Länge von 1700 Byte für den Index 'idx_VarcharNonClustered_Name' überschreitet die maximale Länge von 900 Byte. 
INSERT INTO VarcharNonClustered 
VALUES (1,REPLICATE('a',901))
GO
 Msg 1946 Level 16 State 3 Line 1 
 Operation fehlgeschlagen. Der Indexeintrag mit einer Länge von 901 Byte für den Index 'idx_VarcharNonClustered_Name' überschreitet die maximale Länge von 900 Byte. 
INSERT INTO VarcharNonClustered 
VALUES (1,REPLICATE('a',900))
GO
1 Zeile (n) betroffen

db <> fiddle hier

Einschränkungen des Varchar-Clustered-Index unter SQL Server 2012

CREATE TABLE VarcharClustered
(
  ID INT
  ,Name VARCHAR(2000)
)
GO
CREATE CLUSTERED INDEX idx_VarcharClustered_Name ON VarcharClustered(Name)
GO
 ✓ 
 
 Warnung! Die maximale Schlüssellänge beträgt 900 Byte. Der Index 'idx_VarcharClustered_Name' hat eine maximale Länge von 2000 Bytes. Bei einer Kombination großer Werte schlägt der Einfüge-/Aktualisierungsvorgang fehl. 
INSERT INTO VarcharClustered 
VALUES (1,REPLICATE('a',1701))
GO
 Msg 1946 Level 16 State 3 Line 1 
 Operation fehlgeschlagen. Der Indexeintrag mit einer Länge von 1701 Byte für den Index 'idx_VarcharClustered_Name' überschreitet die maximale Länge von 900 Byte. 
INSERT INTO VarcharClustered 
VALUES (1,REPLICATE('a',1700))
GO
 Msg 1946 Level 16 State 3 Line 1 
 Operation fehlgeschlagen. Der Indexeintrag mit einer Länge von 1700 Byte für den Index 'idx_VarcharClustered_Name' überschreitet die maximale Länge von 900 Byte. 
INSERT INTO VarcharClustered 
VALUES (1,REPLICATE('a',901))
GO
 Msg 1946 Level 16 State 3 Line 1 
 Operation fehlgeschlagen. Der Indexeintrag mit einer Länge von 901 Byte für den Index 'idx_VarcharClustered_Name' überschreitet die maximale Länge von 900 Byte. 
INSERT INTO VarcharClustered 
VALUES (1,REPLICATE('a',900))
GO
1 Zeile (n) betroffen

db <> fiddle hier

Einschränkungen für nicht geclusterte Varchar-Indizes unter SQL Server 2016

CREATE TABLE VarcharNonClustered
(
  ID INT
  ,Name VARCHAR(2000)
)

GO
CREATE NONCLUSTERED INDEX idx_VarcharNonClustered_Name ON VarcharNonClustered(Name)
GO
 ✓ 
 
 Warnung! Die maximale Schlüssellänge für einen nicht gruppierten Index beträgt 1700 Byte. Der Index 'idx_VarcharNonClustered_Name' hat eine maximale Länge von 2000 Bytes. Bei einer Kombination großer Werte schlägt der Einfüge-/Aktualisierungsvorgang fehl. 
INSERT INTO VarcharNonClustered 
VALUES (1,REPLICATE('a',1701))
GO
 Msg 1946 Level 16 State 3 Line 1 
 Operation fehlgeschlagen. Der Indexeintrag mit einer Länge von 1701 Byte für den Index 'idx_VarcharNonClustered_Name' überschreitet die maximale Länge von 1700 Byte für nicht gruppierte Indizes. 
INSERT INTO VarcharNonClustered 
VALUES (1,REPLICATE('a',1700))
GO
1 Zeile (n) betroffen
INSERT INTO VarcharNonClustered 
VALUES (1,REPLICATE('a',901))
GO
1 Zeile (n) betroffen
INSERT INTO VarcharNonClustered 
VALUES (1,REPLICATE('a',900))
GO
1 Zeile (n) betroffen

db <> fiddle hier

Einschränkungen des Varchar-Clustered-Index unter SQL Server 2016

CREATE TABLE VarcharClustered
(
  ID INT
  ,Name VARCHAR(2000)
)
GO
CREATE CLUSTERED INDEX idx_VarcharClustered_Name ON VarcharClustered(Name)
GO
 ✓ 
 
 Warnung! Die maximale Schlüssellänge für einen Clustered-Index beträgt 900 Byte. Der Index 'idx_VarcharClustered_Name' hat eine maximale Länge von 2000 Bytes. Bei einer Kombination großer Werte schlägt der Einfüge-/Aktualisierungsvorgang fehl. 
INSERT INTO VarcharClustered 
VALUES (1,REPLICATE('a',1701))
GO
 Msg 1946 Level 16 State 3 Line 1 
 Operation fehlgeschlagen. Der Indexeintrag mit einer Länge von 1701 Byte für den Index 'idx_VarcharClustered_Name' überschreitet die maximale Länge von 900 Byte für Clustered-Indizes. 
INSERT INTO VarcharClustered 
VALUES (1,REPLICATE('a',1700))
GO
 Msg 1946 Level 16 State 3 Line 1 
 Operation fehlgeschlagen. Der Indexeintrag mit einer Länge von 1700 Byte für den Index 'idx_VarcharClustered_Name' überschreitet die maximale Länge von 900 Byte für Clustered-Indizes. 
INSERT INTO VarcharClustered 
VALUES (1,REPLICATE('a',901))
GO
 Msg 1946 Level 16 State 3 Line 1 
 Operation fehlgeschlagen. Der Indexeintrag mit einer Länge von 901 Byte für den Index 'idx_VarcharClustered_Name' überschreitet die maximale Länge von 900 Byte für Clustered-Indizes. 
INSERT INTO VarcharClustered 
VALUES (1,REPLICATE('a',900))
GO
1 Zeile (n) betroffen

db <> fiddle hier

Zusammenfassung

  • SQL Server 2012 + Nicht-Clustered-Index für Varchar () = maximal 900 Zeichen
  • SQL Server 2012 + Clustered Index auf Varchar () = maximal 900 Zeichen
  • SQL Server 2016 + Nicht-Clustered-Index für Varchar () = max. 1700 Zeichen
  • SQL Server 2016 + Clustered Index auf Varchar () = 900 Zeichen max

Ihre Frage

Das Erstellen eines Index für eine varchar (1024) -Spalte war erfolgreich. Funktioniert es?

Es funktioniert mit den oben genannten Einschränkungen .

Verweise

13