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

varchar(max) überall?

Durch die Verwendung von VARCHAR(MAX) Sie sagen SQL Server im Grunde "Speichern Sie die Werte in diesem Feld so, wie Sie es am besten sehen". SQL Server wählt dann aus, ob Werte als regulärer VARCHAR gespeichert werden sollen oder als LOB (großes Objekt). Wenn die gespeicherten Werte kleiner als 8.000 Byte sind, behandelt SQL Server die Werte im Allgemeinen als reguläres VARCHAR eingeben.

Wenn die gespeicherten Werte zu groß sind, darf die Spalte von der Seite in LOB-Seiten übergehen, genau wie bei anderen LOB-Typen (text , ntext und Bild ) - wenn dies passiert, dann sind zusätzliche Seitenlesevorgänge erforderlich, um die in den zusätzlichen Seiten gespeicherten Daten zu lesen (d. h. es gibt eine Performance-Nachteil), aber dies passiert nur, wenn die gespeicherten Werte zu groß sind .

Tatsächlich können unter SQL Server 2008 oder höher Daten auch mit Datentypen mit fester Länge (z. B. VARCHAR(3.000)) auf zusätzliche Seiten überlaufen ), diese Seiten werden jedoch Zeilenüberlaufdatenseiten genannt und etwas anders behandelt.

Kurzfassung: Aus Speichersicht hat die Verwendung von VARCHAR(MAX) keinen Nachteil über VARCHAR(N) für einige N .

(Beachten Sie, dass dies auch für die anderen Feldtypen mit variabler Länge NVARCHAR gilt und VARBINARY )

FYI - Sie können keine Indizes auf VARCHAR(MAX) Spalten