Maximale Größe von Indexschlüsseln
Wenn Sie einen Index entwerfen, der viele Schlüsselspalten oder große Spalten enthält, berechnen Sie die Größe des Indexschlüssels, um sicherzustellen, dass die maximale Größe für den Indexschlüssel nicht überschritten wird. SQL Server behält den Grenzwert von 900 Bytes für die maximal zulässige Gesamtgröße aller Indexschlüsselspalten bei. Nichtschlüsselspalten, die in der Definition nicht gruppierter Indizes enthalten sind, sind hiervon nicht betroffen.
Berechnen der Größe eines Indexschlüssels
Führen Sie die folgenden Schritte aus, um die Größe eines Indexschlüssels zu berechnen.
Zeigen Sie die Eigenschaften der Tabellenspalten an, auf denen der Index basiert. Sie können dies tun, indem Sie die sys.columns-Katalogsicht verwenden.
Addieren Sie die Längen sämtlicher Spalten, die im Indexschlüssel definiert werden.
Folgende Anweisung fasst beispielsweise die max_length-Spalte der sys.columns-Katalogsicht für die angegebenen Spalten in der Person.Address-Tabelle zusammen.
USE AdventureWorks2008R2; GO SELECT SUM(max_length)AS TotalIndexKeySize FROM sys.columns WHERE name IN (N'AddressLine1', N'AddressLine2', N'City', N'StateProvinceID', N'PostalCode') AND object_id = OBJECT_ID(N'Person.Address');
Hinweis Falls es sich bei einer Tabellenspalte um einen Unicode-Datentyp, wie beispielsweise nchar oder nvarchar handelt, ist die angezeigte Spaltenlänge die Speicherlänge der Spalte. Der Wert entspricht der doppelten Anzahl der in der CREATE TABLE-Anweisung angegebenen Anzahl an Zeichen. Im vorherigen Beispiel ist City als ein nvarchar(30)-Datentyp definiert. Aus diesem Grund ist die Speicherlänge der Spalte 60.
Wenn die Gesamtlänge weniger als 900 Byte beträgt, können die Spalten als Indexschlüsselspalten teilnehmen. Wenn die Gesamtlänge 900 Byte überschreitet, sollten Sie folgende Informationen für Optionen und weitere Überlegungen prüfen.
Die CREATE INDEX-Anweisung verwendet folgende Algorithmen zum Berechnen der Indexschlüsselgröße:
Wenn die Größe aller festen Schlüsselspalten zuzüglich der maximalen Größe aller variablen Schlüsselspalten, die in der CREATE INDEX-Anweisungen angegeben sind, kleiner als 900 Byte ist, wird die CREATE INDEX-Anweisung erfolgreich und ohne Warn- oder Fehlermeldungen abgeschlossen.
Wenn die Größe aller festen Schlüsselspalten zuzüglich der maximalen Größe aller variablen Schlüsselspalten 900 Byte überschreitet, die Größe aller festen Schlüsselspalten zuzüglich der Mindestgröße der variablen Schlüsselspalten jedoch kleiner als 900 Byte ist, wird die CREATE INDEX-Anweisung erfolgreich abgeschlossen. Es wird jedoch eine Warnmeldung ausgegeben, die Sie darüber informiert, dass nachfolgende INSERT- oder UPDATE-Anweisungen einen Fehler erzeugen können, wenn die Anweisungen Werte angeben, die einen Schlüsselwert von mehr als 900 Byte generieren. Die CREATE INDEX-Anweisung erzeugt einen Fehler, wenn vorhandene Datenzeilen in der Tabelle Werte aufweisen, die einen Schlüssel generieren, der den Wert von 900 Byte überschreitet. Eine nachfolgende INSERT- oder UPDATE-Anweisung erzeugt einen Fehler, wenn sie Datenwerte angibt, die einen Schlüsselwert von mehr als 900 Byte generieren.
Die CREATE INDEX-Anweisung erzeugt einen Fehler, wenn die Größe aller festen Spalten zuzüglich der Mindestgröße aller variablen Spalten, die in der CREATE INDEX-Anweisung angegeben sind, 900 Byte überschreitet.
In der folgenden Tabelle werden die Ergebnisse der Erstellung von Indizes zusammengefasst, die die Einschränkungen für die maximale Größe für Indexschlüssel erreichen oder überschreiten.
Mindestgröße von Spalte(n) variabler Länge + Größe der Datenspalte(n) fester Länge |
Maximalgröße von Spalte(n) variabler Länge + Größe der Datenspalte(n) fester Länge |
Maximum der Summe der Längen der Indexschlüsselspalten für vorhandene Zeilen* |
Index wird erstellt |
Der Nachrichtentyp |
INSERT- oder UPDATE-Laufzeitfehler aufgrund von zu großen Indexschlüsselwerten |
---|---|---|---|---|---|
> 900 Byte |
Nicht relevant |
Nicht relevant |
Nein |
Fehler |
Kein Index zum Generieren eines Fehlers vorhanden. |
<= 900 Byte |
<= 900 Byte |
Nicht relevant |
Ja |
Keine |
Nein. |
<= 900 Byte |
> 900 Byte |
<= 900 Byte |
Ja |
Warnung |
Nur, wenn die Summe der aktuellen Längen aller Indexspalten größer als 900 Byte ist. |
<= 900 Byte |
> 900 Byte |
> 900 Byte |
Nein |
Fehler |
Kein Index zum Generieren eines Fehlers vorhanden. |
* Keine der Zeilen in der Tabelle kann zum Zeitpunkt der Ausführung der CREATE INDEX-Anweisung über Indexschlüsselwerte verfügen, deren Gesamtlänge 900 Byte überschreitet.
Verwenden eingeschlossener Spalten, um Größeneinschränkungen zu umgehen
Sie können Nichtschlüsselspalten in einen nicht gruppierten Index einschließen, um die aktuellen Einschränkungen für die Indexgröße von maximal 16 Schlüsselspalten und einer maximalen Indexschlüsselgröße von 900 Byte zu umgehen. SQL Server Database Engine (Datenbankmodul) berücksichtigt beim Berechnen der Anzahl der Indexschlüsselspalten oder der Gesamtgröße der Indexschlüsselspalten keine Nichtschlüsselspalten. In einem nicht gruppierten Index mit eingeschlossenen Spalten, ist die Gesamtgröße der Indexschlüsselspalten auf 900 Byte beschränkt. Die Gesamtgröße aller Nichtschlüsselspalten wird ausschließlich durch die in der INCLUDE-Klausel angegebenen Spalten eingeschränkt, beispielsweise sind varchar(max)-Spalten auf 2 GB beschränkt. Für die Spalten in der INCLUDE-Klausel können alle Datentypen außer text, ntext und image verwendet werden.
Hinweis |
---|
Wenn die Partitionierungsschlüsselspalten beim Partitionieren von Tabellen nicht bereits in einem eindeutigen gruppierten Index vorhanden sind, werden sie dem Index vom Database Engine (Datenbankmodul) hinzugefügt. In einem nicht eindeutigen gruppierten Index darf die kombinierte Größe der indizierten Spalten (ohne eingeschlossene Spalten) plus aller hinzugefügten Partitionierungsspalten 1800 Bytes nicht überschreiten. |