Zeilenüberlauf bei Daten über 8 KB
Eine Tabelle kann maximal 8.060 Byte pro Zeile enthalten. In SQL Server 2008 wurde diese Einschränkung für Tabellen gelockert, die Spalten der Datentypen varchar, nvarchar, varbinary, sql_variant oder Spalten mit CLR-benutzerdefinierten Datentypen enthalten. Die Länge jeder dieser Spalten darf auch weiterhin den Grenzwert von 8.000 Byte nicht überschreiten, allerdings darf die Gesamtbreite der Spalten die 8.060-Byte-Grenze übersteigen. Das gilt für Spalten mit den Datentypen varchar, nvarchar, varbinary, sql_variant sowie für Spalten mit CLR-benutzerdefinierten Datentypen, wenn diese Spalten erstellt und geändert werden, aber auch, wenn Daten aktualisiert oder eingefügt werden.
Hinweis |
---|
Diese Einschränkung gilt nicht für Spalten mit den Datentypen varchar(max), nvarchar(max), varbinary(max), ntext, text, image oder xml. Weitere Informationen zum Speichern dieser Spalten finden Sie unter Verwenden von Datentypen mit umfangreichen Werten, Verwenden von text- und image-Daten und Verwenden von XML-Daten. |
Überlegungen zum Zeilenüberlauf
Wenn Sie Spalten der Datentypen varchar, nvarchar, varbinary, sql_variant oder Spalten mit CLR-benutzerdefinierten Datentypen miteinander kombinieren, die pro Zeile 8.060 Bytes überschreiten, muss Folgendes berücksichtigt werden:
Das Überschreiten der Zeilengröße von 8.060 Byte kann zu einer Leistungsbeeinträchtigung führen, weil SQL Server weiterhin ein Limit von 8 KB pro Seite beibehält. Übersteigt eine Kombination aus Spalten der Datentypen varchar, nvarchar, varbinary, sql_variant oder aus Spalten mit CLR-benutzerdefinierten Datentypen dieses Limit, verschiebt SQL Server Database Engine (Datenbankmodul) die Datensatzspalte mit der größten Breite in die ROW_OVERFLOW_DATA-Zuordnungseinheit, während ein 24-Byte-Zeiger auf der ursprünglichen Seite beibehalten wird. Das Verschieben großer Datensätze zu einer anderen Seite geschieht dynamisch, wenn die Datensätze im Ergebnis von Aktualisierungsvorgängen verlängert wurden. Aktualisierungsvorgängen, die zu einer Verkürzung von Datensätzen führen, können hingegen bewirken, dass Datensätze wieder zurück zur ursprünglichen Seite in der IN_ROW_DATA-Zuordnungseinheit verschoben werden. Außerdem bewirken Abfragen und andere Auswahlvorgänge, wie z. B. Sortierungen oder Verknüpfungen von großen Datensätzen mit Daten, bei denen Zeilenüberlauf vorkommt, eine Herabsetzung der Verarbeitungsgeschwindigkeit, weil diese Datensätze nicht asynchron, sondern synchron verarbeitet werden.
Deshalb sollten Sie beim Entwerfen einer Tabelle mit mehreren Spalten der Datentypen varchar, nvarchar, varbinary, sql_variant oder mit CLR-benutzerdefinierten Datentypen auf den Prozentsatz der Zeilen achten, bei denen es wahrscheinlich zum Überlauf kommt. Außerdem sollten Sie die Häufigkeit berücksichtigen, mit der diese Überlaufdaten wahrscheinlich abgefragt werden. Wenn es wahrscheinlich häufig zu Abfragen von vielen Zeilen mit überlaufenden Daten kommt, sollten Sie eine Normalisierung der Tabelle in Betracht ziehen, damit einige Spalten in eine andere Tabelle verschoben werden. Diese können dann in einer asynchronen JOIN-Operation abgefragt werden.
Die Länge der einzelnen Spalten muss bei den Datentypen varchar, nvarchar, varbinary, sql_variant und CLR-benutzerdefinierten Datentypen weiterhin innerhalb des 8.000-Byte-Limits liegen. Lediglich ihre kombinierten Längen dürfen das Zeilenlimit von 8.060 Byte einer Tabelle überschreiten.
Die Summe der Spalten mit anderen Datentypen, wie char- und nchar-Daten, dürfen das Zeilenlimit von 8.060 Byte nicht übersteigen. Große Objektdaten sind ebenfalls vom 8.060-Byte-Zeilenlimit ausgenommen.
Der Indexschlüssel eines gruppierten Index darf keine varchar-Spalten enthalten, bei denen in der Zuordnungseinheit ROW_OVERFLOW_DATA Daten vorhanden sind. Wird ein gruppierter Index für eine varchar-Spalte erstellt, bei der in der Zuordnungseinheit IN_ROW_DATA Daten vorhanden sind, erzeugen alle nachfolgenden Einfügungen und Aktualisierungen der Spalte einen Fehler, bei der diese Daten aus der Zeile herausgeschoben werden. Weitere Informationen zu Zuordnungseinheiten finden Sie unter Organisationsstruktur von Tabellen und Indizes.
Sie können Spalten, die Daten mit Zeilenüberlauf enthalten, als Schlüssel- oder Nichtschlüsselspalten eines nicht gruppierten Index einbeziehen.
Die Datensatzgrößenbeschränkung für Tabellen, die Spalten mit geringer Dichte verwenden, beträgt 8.018 Byte. Wenn die konvertierten Daten zusammen mit den vorhandenen Datensatzdaten 8.018 Byte überschreiten, wird MSSQLSERVER ERROR 576 zurückgegeben. Wenn Spalten zwischen Typen mit geringer Dichte und anderen Typen konvertiert werden, behält Database Engine (Datenbankmodul) eine Kopie der aktuellen Datensatzdaten bei. Dies verdoppelt vorübergehend den Speicher, der für den Datensatz erforderlich ist.
Zum Abrufen von Informationen zu Tabellen oder Indizes, die ggf. Daten mit Zeilenüberlauf enthalten, verwenden Sie die dynamische Verwaltungsfunktion sys.dm_db_index_physical_stats.