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.
varchar(max)
ist wahrscheinlich eher wie OracleCLOB
VARCHAR(255)
undVARCHAR(2)
nehmen Sie genau die gleiche Menge Speicherplatz auf der Festplatte! Der einzige Grund, dies einzuschränken, besteht darin, dass Sie ein spezifisches Bedürfnis haben, es kleiner zu machen. Ansonsten machen sie alle 255.Insbesondere beim Sortieren nehmen größere Spalten mehr Platz ein. Wenn dies die Leistung beeinträchtigt, müssen Sie sich darum kümmern und sie verkleinern. Wenn Sie jedoch immer nur eine Zeile aus dieser Tabelle auswählen, können Sie sie alle auf 255 setzen, und das spielt keine Rolle.
Siehe: Was sind die optimalen Varchar-Größen für MySQL?
quelle
VARCHAR(MAX)
? Speicherplatz ist nicht die einzige Überlegung bei der Modellierung einer Datenbank. Die Domäne, die Sie modellieren, sollte die Datentypen und die Größen bestimmen.VARCHAR(MAX)
ist nicht dasselbe wievarchar(255)
odervarchar(65535)
- varchar max ist eintext
Datentyp. Und zu Ihrem Punkt - wenn er wüsste, welche "Domäne er modellierte", würde er diese Frage nicht stellen. Offensichtlich weiß er nicht, wie groß seine Daten werden, und ich versichere ihm, dass es nichts schadet, wenn er in voller Größe erstellt wird.(a,b,c,d)
Index haben, wenn alle vier Spalten vorhanden sindVARCHAR(255)
.Immer wenn ich eine neue SQL-Tabelle einrichte, sehe ich 2 ^ n als "gleichmäßiger" ... aber um die Antworten hier zusammenzufassen, gibt es keine signifikanten Auswirkungen auf den Speicherplatz, wenn Sie einfach varchar (2 ^ n) definieren. oder sogar varchar (MAX).
Sie sollten jedoch die möglichen Auswirkungen auf Speicher und Leistung vorhersehen, wenn Sie ein hohes varchar () -Limit festlegen. Angenommen, Sie erstellen eine Varchar-Spalte (MAX) für Produktbeschreibungen mit Volltextindizierung. Wenn 99% der Beschreibungen nur 500 Zeichen lang sind und Sie plötzlich jemanden finden, der diese Beschreibungen durch Wikipedia-Artikel ersetzt, werden Sie möglicherweise unerwartete signifikante Speicher- und Leistungstreffer feststellen.
Eine andere Sache, die von Bill Karwin zu beachten ist :
Überlegen Sie sich im Grunde nur vernünftige geschäftliche Einschränkungen und Fehler bei einer etwas größeren Größe. Wie @onedaywhen hervorhob, liegen Familiennamen in Großbritannien normalerweise zwischen 1 und 35 Zeichen. Wenn Sie sich für varchar (64) entscheiden, werden Sie nichts wirklich verletzen ... es sei denn, Sie speichern den Familiennamen dieses Mannes , der bis zu 666 Zeichen lang sein soll. In diesem Fall ist varchar (1028) vielleicht sinnvoller.
Und falls es hilfreich ist, hier ist, wie varchar 2 ^ 5 bis 2 ^ 10 aussehen könnte, wenn es gefüllt ist:
quelle
Der beste Wert ist derjenige, der für die in der zugrunde liegenden Domäne definierten Daten geeignet ist.
Für einige Domains
VARCHAR(10)
ist dasName
Attribut richtig , für andere DomainsVARCHAR(255)
möglicherweise die beste Wahl.quelle
Wenn Sie die Antwort von a_horse_with_no_name hinzufügen, finden Sie möglicherweise Folgendes von Interesse ...
Vergessen Sie nicht die Längenbytes und das nullbare Byte, also:
name varchar(100) not null
wird 1 Byte (Länge) + bis zu 100 Zeichen (lateinisch1) seinname varchar(500) not null
wird 2 Bytes (Länge) + bis zu 500 Zeichen (latin1) seinname varchar(65533) not null
wird 2 Bytes (Länge) + bis zu 65533 Zeichen (latin1) seinname varchar(65532)
wird 2 Bytes (Länge) + bis zu 65532 Zeichen (Latin1) + 1 Null-Byte seinHoffe das hilft :)
quelle
Wenden Sie sich immer an Ihren Business Domain-Experten. Wenn Sie es sind, suchen Sie nach einem Industriestandard. Wenn es sich bei der fraglichen Domain beispielsweise um den Familiennamen (Nachname) einer natürlichen Person handelt, würde ich für ein britisches Unternehmen zum gehen britischen Govtalk-Datenstandardkatalog nach Personeninformationen suchen und feststellen, dass ein Familienname zwischen 1 und 35 Zeichen lang ist .
quelle
Ich habe dies in letzter Zeit nicht überprüft, aber ich weiß in der Vergangenheit mit Oracle, dass der JDBC-Treiber während der Abfrageausführung einen Teil des Speichers reservieren würde, um die zurückkommende Ergebnismenge zu speichern. Die Größe des Speicherblocks hängt von den Spaltendefinitionen und der Abrufgröße ab. Die Länge der varchar2-Spalten beeinflusst also, wie viel Speicher reserviert ist. Dies verursachte vor Jahren schwerwiegende Leistungsprobleme für mich, da wir immer varchar2 (4000) (damals das Maximum) verwendeten und die Speicherbereinigung viel weniger effizient war als heute.
quelle
In gewissem Sinne haben Sie Recht, obwohl alles, was weniger als 2 ^ 8 Zeichen enthält, immer noch als Datenbyte registriert wird.
Wenn Sie den Basischarakter berücksichtigen, der mit einem VARCHAR <255 etwas übrig lässt, das dieselbe Menge an Speicherplatz verbraucht.
255 ist eine gute Basisdefinition, es sei denn, Sie möchten übermäßige Eingaben besonders einschränken.
quelle