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

Wie kommen Sie an Grenzen von 8060 Bytes pro Zeile und 8000 pro (varchar, nvarchar) Wert?

Das Innere der Speicher-Engine:Anatomie eines Datensatzes

Dies gilt für SQL Server 2005

  • Kopfzeile des Datensatzes
    • 4 Byte lang
    • zwei Byte Datensatz-Metadaten (Datensatztyp)
    • zwei Bytes, die im Datensatz auf die NULL-Bitmap zeigen
  • Teil des Datensatzes mit fester Länge, der die Spalten enthält, in denen Datentypen mit fester Länge gespeichert sind (z. B. bigint, char(10), datetime)
  • NULL-Bitmap
    • zwei Bytes für die Anzahl der Spalten im Datensatz
    • variable Anzahl von Bytes, um ein Bit pro Spalte im Datensatz zu speichern, unabhängig davon, ob die Spalte nullable ist oder nicht (dies ist anders und einfacher als SQL Server 2000, der nur ein Bit pro nullable-Spalte hatte)
    • Dies ermöglicht eine Optimierung beim Lesen von Spalten, die NULL sind
  • Spalten-Offset-Array variabler Länge
    • zwei Bytes für die Anzahl der Spalten mit variabler Länge
    • zwei Bytes pro Spalte mit variabler Länge, die den Versatz zum Ende des Spaltenwertversionierungs-Tags angeben
  • Dies ist nur in SQL Server 2005 und ist eine 14-Byte-Struktur, die einen Zeitstempel und einen Zeiger auf den Versionsspeicher in tempdb enthält

Also für ein Zeichen (8000)

  • 4 Bytes (Record Header)
  • 8000 feste Länge
  • 3 Null-Bitmap
  • 2 Bytes zum Zählen variabler Länge
  • 14 Zeitstempel

Wenn Sie jedoch 40 varchar(200)-Spalten hätten

  • 4 Bytes (Record Header)
  • 0 feste Länge
  • 6 Null-Bitmap
  • 2 Bytes zum Zählen variabler Länge
  • 202 x 40 =8080
  • 14 Zeitstempel

Gesamt =8080 + 4 + 6 + 2 + 14 =8106. WTF? Sie erhalten eine Warnung, wenn Sie diese Tabelle erstellt haben

Ich würde mich nicht zu sehr darauf einlassen:Diese Information hat nein praktischer Alltagswert