Welche Konsequenzen hat das Setzen von varchar (8000)?

22

Gibt es einen Grund, warum wir varchar nicht immer als Maximum definieren sollten, z. B. varchar(8000)unter SQL Server, da varchar einen der Feldgröße proportionalen Speicherplatz benötigt ?

Wenn ich jemanden beim Erstellen eines Tisches sehe, varchar(100)sollte ich ihm sagen, dass du falsch liegst, was du tun sollst varchar(8000)?

Aleksandr Levchuk
quelle
Ich denke, wir müssen hier zwischen der Verwendung in create table und der Verwendung in Parameterdeklarationen von gespeicherten Prozeduren unterscheiden. Für die zweite Interpretation siehe meine Frage dba.stackexchange.com/questions/1772/…
bernd_k

Antworten:

18
  • Länge ist eine Einschränkung für die Daten (wie CHECK, FK, NULL usw.)
  • Leistung, wenn die Zeile 8060 Byte überschreitet
  • Kann keine eindeutige Einschränkung oder keinen eindeutigen Index haben (Schlüsselspaltenbreite muss <900 sein)
  • Die Standardeinstellung ist SET ANSI PADDING ON = Potenzial für die Speicherung vieler nachgestellter Leerzeichen
  • SQL Server geht davon aus, dass die durchschnittliche Länge für Sortiervorgänge 4000 beträgt, wobei der Speicher auf dieser Grundlage zugewiesen wird.

Zusammenfassung: Tu es nicht.

gbn
quelle
Leistung, wenn die Zeile 8060 Byte überschreitet . Das bezieht sich auf tatsächlich verwendete Bytes und nicht auf maximal zulässige Bytes?
bernd_k
@bernd_k: 8060 = größte Datenmenge für eine Zeile, die in eine einzelne 8192-Seite passt. Zeilen-Overhead einbeziehen. Rest (132 Bytes) = Seitenaufwand
gbn
Dies bedeutet, dass die Leistung abnimmt, wenn die größere Größe tatsächlich verwendet wird, und nicht nur, dass die Verwendung zulässig ist.
bernd_k
@bernd_k: Jegliche Leistungsminderung wird verursacht durch 1. Speicherzuweisung für Sortierungen usw. 2. Zeilenüberlauf (> 8060 Bytes). Die Tatsache, dass in jedem varchar (8000) 10 Zeichen enthalten sind, ist irrelevant, bis diese Bedingungen erfüllt sind (SQL warnt später vor möglichen Fehlern bei Indexschlüsseln)
gbn
Ist das Sortieren einer Tabelle mit einer varchar (100) -Spalte, die mit Feldern mit einer Länge von 100 Byte gefüllt ist, eine andere Frage wert, da das Sortieren einen Durchschnitt von 50 Zeichen voraussetzt?
bernd_k
7

Angenommen, Sie beziehen sich auf SQL Server, dann fällt mir einer ein.

Es gibt ein Limit für die Größe (8 KB) einer Zeile in einer Tabelle, und mit SQL können Sie varchar-Felder definieren, die dieses Limit theoretisch überschreiten könnten. Der Benutzer könnte also Fehler bekommen, wenn er zu viele Daten in das dafür vorgesehene Feld schreibt.

Ab SQL 2K8 können Sie dieses Limit überschreiten, es gibt jedoch Auswirkungen auf die Leistung .

Es gibt auch die Möglichkeit, die Größe auf das zu beschränken, was Sie von den Daten erwarten. Wenn Sie ein unbegrenztes Längenfeld wünschen, warum nicht mit Text oder ntext gehen?

JohnFx
quelle
Werden die Datentypen text und ntext so gespeichert, dass die Leistung nicht beeinträchtigt wird?
Tschad
Diese Typen tragen nicht so stark zur Beschränkung der Zeilengröße auf 8 KB in einer Tabelle bei, da die tatsächlichen Daten in einer separaten Tabelle unter dem Deckblatt gespeichert werden, anstatt mit den übrigen Spalten übereinzustimmen. Es gibt immer noch Leistungseinbußen, jedoch aus verschiedenen Gründen. Verglichen mit varchar und nvarchar
JohnFx,
text und ntext werden zugunsten von varchar (max) nicht mehr empfohlen.
Phil Helmer
3

Kommt es doch darauf an, welche Informationen im Feld gespeichert werden?

Einige Dinge werden aus einer Reihe von Gründen eine maximale Länge haben, und wenn es eine maximale Länge geben muss, sollte dies die Länge Ihres Feldes sein.

Wenn es theoretisch keine maximale Länge gibt, würde ich fragen, warum varchar verwendet wird.

Toby
quelle
3

Im Kontext von Oracle-Datenbanken habe ich gelernt, dass die Verwendung der kleinsten Feldgröße für Datenbankspalten immer eine Gefahr darstellt.

Wenn Sie Daten per Import-Export aus einer Datenbank mit Einzelbyte-Kollatierung in eine mit Mehrfachbyte-Kollatierung (wie Oracle XE) verschieben, kann sich die Länge in Bytes erhöhen und der Import der Daten in die durch den Import erstellten Tabellen schlägt fehl. Natürlich hat Oracle die Möglichkeit, varchar2 length entweder als char oder als byte zu definieren.

Mein Punkt hier ist, dass es nicht immer klug ist, ein Feld mit immer so klein wie möglich zu definieren. Ich habe viele Änderungstabellen gesehen, um das Feld später zu vergrößern (verursacht durch geänderte Anforderungen).

20% - 100% ungenutztes Feld mit zu haben, ist hier eine diskutierbare Option.

bernd_k
quelle