Kein mir bekanntes DBMS hat eine "Optimierung", die eine Leistung VARCHAR
mit einer 2^n
Länge besser macht als eine mit einer max
Länge, die keine Potenz von 2 ist.
Ich denke, frühe SQL Server-Versionen haben a VARCHAR
mit einer Länge von 255 anders behandelt als eine mit einer höheren maximalen Länge. Ich weiß nicht, ob dies noch der Fall ist.
Bei fast allen DBMS wird der tatsächlich erforderliche Speicher nur durch die Anzahl der eingegebenen Zeichen bestimmt, nicht durch die von max
Ihnen definierte Länge. Aus Speichersicht (und höchstwahrscheinlich auch unter Leistungsgesichtspunkten) spielt es also keine Rolle, ob Sie eine Spalte als VARCHAR(100)
oder deklarieren VARCHAR(500)
.
Sie sollten die max
für eine VARCHAR
Spalte angegebene Länge als eine Art Einschränkung (oder Geschäftsregel) und nicht als eine technische / physische Sache betrachten.
Für PostgreSQL ist das beste Setup die Verwendung text
ohne Längenbeschränkung und aCHECK CONSTRAINT
die Anzahl der Zeichen auf die Anforderungen Ihres Unternehmens zu beschränken.
Wenn sich diese Anforderung ändert, ist das Ändern der Prüfbedingung viel schneller als das Ändern der Tabelle (da die Tabelle nicht neu geschrieben werden muss).
Dasselbe kann für Oracle und andere angewendet werden - in Oracle wäre dies jedoch VARCHAR(4000)
nicht der Fall text
.
Ich weiß nicht, ob es einen physischen Speicherunterschied zwischen VARCHAR(max)
und z VARCHAR(500)
. B. in SQL Server gibt. Aber anscheinend gibt es einen Leistungseinbruch bei der Verwendung varchar(max)
im Vergleich zu varchar(8000)
.
Siehe diesen Link (gepostet von Erwin Brandstetter als Kommentar)
Bearbeiten 2013-09-22
In Bezug auf Bigowns Kommentar:
In Postgres - Versionen vor 9.2 (das war nicht verfügbar , als ich die erste Antwort schrieb) eine Änderung der Spaltendefinition hat die gesamte Tabelle neu zu schreiben, siehe zB hier . Seit 9.2 ist dies nicht mehr der Fall und ein schneller Test bestätigte, dass das Erhöhen der Spaltengröße für eine Tabelle mit 1,2 Millionen Zeilen tatsächlich nur 0,5 Sekunden dauerte.
Für Oracle scheint dies auch zuzutreffen, gemessen an der Zeit, die zum Ändern der varchar
Spalte einer großen Tabelle benötigt wird. Aber ich konnte keine Referenz dafür finden.
Für MySQL heißt es im Handbuch " In den meisten Fällen ALTER TABLE
wird eine temporäre Kopie der Originaltabelle erstellt ". Und meine eigenen Tests bestätigen Folgendes: Das Ausführen einer ALTER TABLE
Tabelle mit 1,2 Millionen Zeilen (wie in meinem Test mit Postgres) zum Erhöhen der Größe einer Spalte dauerte 1,5 Minuten. In MySQL können Sie jedoch nicht die "Problemumgehung" verwenden, um eine Prüfbedingung zu verwenden, um die Anzahl der Zeichen in einer Spalte zu begrenzen.
Für SQL Server konnte ich keine eindeutige Aussage dazu finden, aber die Ausführungszeit zum Erhöhen der Größe einer varchar
Spalte (wieder die Tabelle mit 1,2 Millionen Zeilen von oben) zeigt an, dass kein Umschreiben stattfindet.
Bearbeiten 2017-01-24
Scheint, als hätte ich mich (zumindest teilweise) in Bezug auf SQL Server geirrt. Siehe diese Antwort von Aaron Bertrand , die zeigt, dass die deklarierte Länge von a nvarchar
oder varchar
Spalten einen großen Unterschied für die Leistung macht.