Ist Varchar (MAX) immer vorzuziehen?

74

In Bezug auf SQL Server verstehe ich:

  • var bedeutet, dass der Speicher verzögert zugewiesen ist, was bedeutet, dass er genau zu den Daten passt (beim Einfügen).

  • MAX bedeutet, dass es keine Größenbeschränkung gibt.

Ist es dann immer vorzuziehen, MAXwenn Sie verwenden varchar, da wir sowieso nicht die gesamte Größe zuweisen?

Sollten wir eine konstante Größe nur verwenden, wenn es eine Einschränkung gibt, die wir für diese DB-Spalte erzwingen möchten?

Elad Benda
quelle
4
Dies kann vom Datenbanksystem abhängen. Auf welches beziehen Sie sich?
Jjmontes
1
Außerdem möchte ich hinzufügen, dass die Längenbeschränkung Teil der Einschränkungen des Datenmodells ist und einige Leute auch auf dieser Ebene sehr streng sind.
Jjmontes
10
Ein weiterer Punkt: Da ein Indexeintrag in SQL Server nur maximal 900 Byte lang sein darf, können Sie niemals einen Index für eine VARCHAR(MAX)Spalte erstellen.
marc_s
"Sollten wir eine konstante Größe nur verwenden, wenn es eine Einschränkung gibt, die wir für diese DB-Spalte erzwingen möchten?" - Sie lassen es so klingen, als wären solche Spalten die weniger verbreiteten der beiden Möglichkeiten. Meine Erfahrung sagt mir das Gegenteil.
Tag, wenn
Die Antwort lautet NEIN. Es ist nicht vorzuziehen, VARCHAR (MAX) zu verwenden. Siehe unten für weitere Details.
Shane

Antworten:

59

Es gibt einen sehr guten Artikel zu diesem Thema von SO User @Remus Rusanu. Hier ist ein Ausschnitt, den ich gestohlen habe, aber ich schlage vor, Sie lesen das Ganze:

Der Codepfad, der die MAX-Typen (varchar, nvarchar und varbinary) behandelt, unterscheidet sich vom Codepfad, der die entsprechenden Typen mit nicht maximaler Länge behandelt. Die Nicht-Max-Typen können intern als gewöhnliche Zeiger- und Längenstruktur dargestellt werden. Die maximalen Typen können jedoch nicht intern als zusammenhängender Speicherbereich gespeichert werden, da sie möglicherweise bis zu 2 GB groß werden können. Sie müssen also durch eine Streaming-Schnittstelle dargestellt werden, die dem IStream von COM ähnelt. Dies überträgt sich auf jede Operation, die die maximalen Typen umfasst, einschließlich einfacher Zuweisung und Vergleich, da diese Operationen über eine Streaming-Schnittstelle komplizierter sind. Die größte Auswirkung ist im Code sichtbar, der Variablen vom Typ max zuweist und zuweist (mein erster Test), aber die Auswirkung ist bei jeder Operation sichtbar.

In dem Artikel zeigt er mehrere Beispiele, die zeigen, dass die Verwendung von varchar (n) typischerweise die Leistung verbessert.

Den gesamten Artikel finden Sie hier .

Abe Miessler
quelle
1
Auch MAX-Typen verhindern Online-Operationen, zumindest bis zu SQL Server 11. rusanu.com/2011/08/05/…
Remus Rusanu
1
Was ist also der maximale Wert, nmit varchar(n)dem Sie die Vorteile der Verwendung nutzen können varchar(n)?
Superdooperhero
@ Superdooperhero das Maximum n ist 8000
aturc
17

Suchen Sie hier nach einer guten Antwort:

Soll ich varchar (n) oder varchar (MAX) verwenden?

Die kurze Antwort lautet: Aus Speichersicht ist es dasselbe, aus Sicht der Abfrageoptimierung ist es jedoch besser, varchar (N) zu verwenden.

Garrett Vlieger
quelle
14

Microsoft empfiehlt Folgendes:

  • Verwenden Sie char, wenn die Größen der Spaltendateneinträge konsistent sind.
  • Verwenden Sie varchar, wenn die Größe der Spaltendateneinträge erheblich variiert.
  • Verwenden Sie varchar (max), wenn die Größe der Spaltendateneinträge erheblich variiert und die Größe möglicherweise 8.000 Byte überschreitet.

ref

OO
quelle
3
Ich würde raten, weil die Aussage, dass es in Ordnung ist, VARCHAR (MAX) für alles zu verwenden, falsch ist?
HardCode
1
Ihre aktuelle, bearbeitete Antwort unterscheidet sich drastisch von Ihrer ursprünglichen Antwort, unabhängig davon, ob Sie dies in Ihrer ursprünglichen Antwort beabsichtigt haben oder nicht.
HardCode
1
Die erste Antwort war falsch, also habe ich sie abgelehnt. Sie haben im Grunde genommen angedeutet, dass es in Ordnung ist, varchar (max) zu verwenden, wo und wann immer Sie wollen, ohne Konsequenzen. Falsche Antworten verdienen (und erhalten) Abstimmungen.
JNK
12

Um diesbezüglich ganz explizit zu sein, lautet die Antwort NEIN . Es ist immer vorzuziehen, varchar (N) zu verwenden. Wenn Sie wissen, dass die Größe nicht variiert, dann char (N). Die MAX-Typen unterstützen die meisten nativen SQL-Funktionen nicht und können sie daher nicht unterstützen, sodass Sie keine Indizes hinzufügen, Verknüpfungen durchführen oder effektive Suchen für diese Typen durchführen können. Dies ist übrigens ein Grund, warum die Volltextsuche in SQL Server vorhanden ist.

Darüber hinaus verhindert varchar (max), dass Online-Indizes für die gesamte Tabelle ausgeführt werden können, die das Feld varchar (max) enthält. Dies wirkt sich erheblich auf die Leistung Ihres Systems aus.

Varchar (max) sollte immer nur verwendet werden, wenn bekannt ist, dass die Feldgröße über 8 KB liegt. In jedem anderen Fall muss die Größe angegeben werden. Geschieht dies nicht , ist so schlechtes Design und wird zu Performance - Problemen auf jedem führen , aber die banalsten von Systemen.

Einige Referenzen:

Shane
quelle