Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Best Practices für die Länge der SQL-Varchar-Spalte

Kein mir bekanntes DBMS hat eine "Optimierung", die einen VARCHAR erstellt mit einem 2^n Länge besser abschneiden als eine mit max Länge, die keine Zweierpotenz ist.

Ich denke, dass frühe SQL Server-Versionen tatsächlich einen VARCHAR behandelt haben mit Länge 255 anders als eine mit größerer Maximallänge. Ich weiß nicht, ob das immer noch so ist.

Bei fast allen DBMS wird der tatsächlich benötigte Speicherplatz nur durch die Anzahl der eingegebenen Zeichen bestimmt, nicht durch max Länge, die Sie definieren. Aus Speichersicht (und höchstwahrscheinlich auch aus Performancesicht) macht es also keinen Unterschied, ob Sie eine Spalte als VARCHAR(100) deklarieren oder VARCHAR(500) .

Sie sollten das max sehen für einen VARCHAR bereitgestellte Länge Spalte als eine Art Einschränkung (oder Geschäftsregel) und nicht als technische/physikalische Sache.

Für PostgreSQL ist die beste Einrichtung die Verwendung von text ohne Längenbeschränkung und CHECK CONSTRAINT Dadurch wird die Anzahl der Zeichen auf die Anforderungen Ihres Unternehmens begrenzt.

Wenn sich diese Anforderung ändert, ist das Ändern der Check-Einschränkung viel schneller als das Ändern der Tabelle (weil die Tabelle nicht neu geschrieben werden muss)

Dasselbe gilt für Oracle und andere - in Oracle wäre es VARCHAR(4000) statt text obwohl.

Ich weiß nicht, ob es einen physischen Speicherunterschied zwischen VARCHAR(max) gibt und z.B. VARCHAR(500) im SQL-Server. Aber anscheinend gibt es eine Auswirkung auf die Leistung, wenn varchar(max) verwendet wird im Vergleich zu varchar(8000) .

Siehe diesen Link (von Erwin Brandstetter als Kommentar gepostet)

Bearbeitet am 22.09.2013

Zu Bigowns Kommentar:

In Postgres-Versionen vor 9.2 (die nicht verfügbar waren, als ich die ursprüngliche Antwort schrieb) wurde eine Änderung an der Spaltendefinition tat schreibe die ganze Tabelle um, siehe z.B. hier . Seit 9.2 ist dies nicht mehr der Fall und ein Schnelltest 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 benötigt wird, um den varchar einer großen Tabelle zu ändern Säule. Aber ich konnte keine Referenz dafür finden.

Für MySQL sagt das Handbuch "In den meisten Fällen ALTER TABLE erstellt eine temporäre Kopie der Originaltabelle ". Und meine eigenen Tests bestätigen das:Ausführen eines ALTER TABLE Auf einer Tabelle mit 1,2 Millionen Zeilen (dasselbe wie in meinem Test mit Postgres) dauerte es 1,5 Minuten, um die Größe einer Spalte zu erhöhen. In MySQL ist dies jedoch nicht möglich Verwenden Sie die "Problemumgehung", um eine Prüfbeschränkung zu verwenden, um die Anzahl der Zeichen in einer Spalte zu begrenzen.

Für SQL Server konnte ich keine klare Aussage dazu finden, aber die Ausführungszeit, um die Größe eines varchar zu erhöhen Spalte (wieder die 1,2-Millionen-Zeilen-Tabelle von oben) gibt an, dass nein Überschreiben erfolgt.

Bearbeitet am 24.01.2017

Scheint, als hätte ich mich (zumindest teilweise) in Bezug auf SQL Server geirrt. Siehe diese Antwort von Aaron Bertrand das zeigt, dass die deklarierte Länge eines nvarchar oder varchar Spalten macht einen großen Unterschied für die Leistung.