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

Maximale Zeilengröße von SQL Server vs. Varchar(Max)-Größe

In Microsoft SQL Server werden Daten (einschließlich Indizes) in einer oder mehreren 8k (8192 Bytes) "Seiten" gespeichert. Es gibt verschiedene Arten von Seiten, die verwendet werden können, um verschiedene Situationen zu handhaben (z. B. Daten, LOB, Index, AllocationMap usw.). Jede Seite hat einen Header, der Metadaten über diese Seite und ihren Inhalt enthält.

Die meisten Daten werden in der Zeile selbst gespeichert, und eine oder mehrere dieser Zeilen werden wiederum auf einer Seite für "In-Row-Daten" gespeichert. Aufgrund des Speicherplatzes, der vom Zeilenheader eingenommen wird, darf eine Zeile maximal 8060 Byte groß sein (für "in-row"-Daten).

Allerdings werden nicht alle Daten in der Zeile gespeichert. Für bestimmte Datentypen können die Daten tatsächlich auf einer "LOB-Daten"-Seite gespeichert werden, während ein Zeiger in den "In-Row"-Daten verbleibt:

  • Veraltete / veraltete LOB-Typen, die niemand mehr verwenden sollte (TEXT , NTEXT , und IMAGE ) speichern ihre Daten standardmäßig immer auf LOB-Seiten und verwenden immer einen 16-Byte-Zeiger auf diese LOB-Seite.

  • Die neueren LOB-Typen (VARCHAR(MAX) , NVARCHAR(MAX) , VARBINARY(MAX) und XML ) versucht standardmäßig, die Daten direkt in die Zeile einzupassen, wenn dies passt. Andernfalls speichert es die Daten auf LOB-Seiten und verwendet einen Zeiger von 24 - 72 Bytes (abhängig von der Größe der LOB-Daten).

So könnten Sie bis zu 78 GB + 4 Bytes speichern (INT nicht vergessen Primärschlüssel;-) in einer einzelnen Zeile:Die maximale Zeilengröße liegt zwischen 940 Bytes ((39 * 24) + 4) und 2812 Bytes ((39 * 72) + 4). Aber auch das ist nur die maximale Reichweite; wenn die Daten in jedem der 39 VARCHAR(MAX) Felder nur 10 Bytes groß sind, dann werden alle Daten in der Zeile gespeichert und die Zeilengröße beträgt 394 Bytes ((39 * 10) + 4).

Da Sie so viele Felder mit variabler Länge haben (ob sie MAX sind oder nicht), besteht die einzige Möglichkeit, die Größe zukünftiger Zeilen abzuschätzen, darin, eine gute Vorstellung davon zu haben, welche Daten Sie in dieser Tabelle speichern werden. Obwohl eine Tabelle mit allen oder sogar den meisten MAX-Datentypen impliziert, dass niemand wirklich eine Ahnung hat, was in dieser Tabelle gespeichert wird.

In diesem Sinne sollte darauf hingewiesen werden, dass dies eine schrecklich modellierte Tabelle / schreckliche Verwendung von MAX-Datentypfeldern ist und umgestaltet werden sollte.

Weitere Einzelheiten darüber, wie Datenseiten strukturiert sind, finden Sie in meiner Antwort auf die folgende DBA.StackExchange-Frage:

SUM of DATALENTHS stimmt nicht mit der Tabellengröße von sys.allocation_units überein