Kein mir bekanntes DBMS hat eine "Optimierung", die eine VARCHAR
mit einer 2^n
Länge besser abschneiden als eine mit einer max
Länge, die nicht eine Potenz von 2 ist.
Ich glaube, frühe SQL Server-Versionen behandelten tatsächlich eine VARCHAR
mit der Länge 255 anders als eine mit einer höheren Maximallänge. Ich weiß nicht, ob dies immer noch der Fall ist.
Bei fast allen DBMS hängt der tatsächlich benötigte Speicherplatz nur von der Anzahl der Zeichen ab, die Sie eingeben, nicht von der max
Länge definieren Sie. Unter dem Gesichtspunkt der Speicherung (und wahrscheinlich auch der Leistung) macht es also keinen Unterschied, ob Sie eine Spalte als VARCHAR(100)
o VARCHAR(500)
.
Sie sollten die max
Länge vorgesehen für eine VARCHAR
Spalte als eine Art Einschränkung (oder Geschäftsregel) und nicht als eine technische/physikalische Sache.
Für PostgreSQL ist die beste Einstellung die Verwendung von text
ohne Längenbeschränkung und eine CHECK CONSTRAINT
die die Anzahl der Zeichen auf das begrenzt, was Ihr Unternehmen benötigt.
Wenn sich diese Anforderung ändert, ist die Änderung der Prüfbeschränkung viel schneller als die Änderung der Tabelle (weil die Tabelle nicht neu geschrieben werden muss).
Das Gleiche gilt für Oracle und andere - bei Oracle wäre es VARCHAR(4000)
anstelle von text
Allerdings.
Ich weiß nicht, ob es einen Unterschied in der physischen Speicherung gibt zwischen VARCHAR(max)
und z.B. VARCHAR(500)
in SQL Server. Aber offenbar gibt es Leistungseinbußen bei der Verwendung von varchar(max)
im Vergleich zu varchar(8000)
.
Siehe dieser Link (veröffentlicht von Erwin Brandstetter als Kommentar)
Bearbeiten 2013-09-22
Zum Kommentar von bigown:
In Postgres-Versionen vor 9.2 (die noch nicht verfügbar waren, als ich die erste Antwort schrieb) ist eine Änderung der Spaltendefinition hat die gesamte Tabelle neu zu schreiben, siehe z.B. aquí . Seit Version 9.2 ist dies nicht mehr der Fall, und ein kurzer Test bestätigte, dass die Erhöhung der Spaltengröße für eine Tabelle mit 1,2 Millionen Zeilen tatsächlich nur 0,5 Sekunden dauerte.
Für Oracle scheint dies ebenfalls zu gelten, wenn man die Zeit betrachtet, die es braucht, um die Daten einer großen Tabelle zu ändern. varchar
Spalte. Ich konnte jedoch keinen Hinweis darauf finden.
Für MySQL das Handbuch sagt " In den meisten Fällen, ALTER TABLE
erstellt eine temporäre Kopie der Originaltabelle ". Und meine eigenen Tests bestätigen das: Die Ausführung eines ALTER TABLE
bei einer Tabelle mit 1,2 Millionen Zeilen (wie in meinem Test mit Postgres), um die Größe einer Spalte zu erhöhen, 1,5 Minuten. In MySQL hingegen können Sie no Verwenden Sie die "Abhilfe", um die Anzahl der Zeichen in einer Spalte durch eine Prüfbeschränkung zu begrenzen.
Für SQL Server konnte ich keine klare Aussage dazu finden, aber die Ausführungszeit für die Vergrößerung einer varchar
Spalte (wieder die Tabelle mit den 1,2 Millionen Zeilen von oben) zeigt, dass keine umgeschrieben wird.
Bearbeiten 2017-01-24
Es scheint, dass ich mich (zumindest teilweise) in Bezug auf SQL Server geirrt habe. Siehe diese Antwort von Aaron Bertrand die zeigt, dass die angegebene Länge einer nvarchar
o varchar
Spalten macht einen großen Unterschied für die Leistung.