Überbewertung der Feldgröße im Datenbankdesign

11

Ich habe einige Felder für meine Tabellen, die Zeichenfolgen sind, und im Moment haben die meisten Feldgrößen ziemlich hohe Zeichenbeschränkungen. Zum Beispiel 100 Zeichen für den Straßennamen. Gibt es eine Strafe für die Verwendung großer Felder? Wenn ich beispielsweise das Limit für dieses Feld auf 30 Zeichen ändere, gibt es dann einen Leistungsgewinn oder eine Effizienz mit der Größe? Es würde ungefähr 50 Felder geben, die Kandidaten für eine Schrumpfung sein könnten.

Vielen Dank für Ihre Vorschläge.


quelle
Für char wird der Speicherplatz immer in der Datenbank verwendet, aber für varchar ist die Strafe zwar geringer, aber die Notwendigkeit, während der Operationen, die Sie wirklich benötigen, einen größeren Speicherplatz vorzusehen, kann ihn auch noch etwas weniger effizient machen. Ich würde mir keine Gedanken über Varchar-Spalten machen, es sei denn, sie sind sehr groß - wie immer mit Varchar (max) oder Varchar (1000).
Cade Roux
Sie sollten darauf achten, die Größe einer Seite (8 KB) zu überschreiten, da dies die Leistung beeinträchtigt. Schauen Sie sich diesen Beitrag an: stackoverflow.com/questions/2518922/…
Angesichts der geringen Kosten für Festplatten würde ich mir heutzutage keine Sorgen um die Effizienz des Speichers machen. Wie JNK sagt, hat dies Auswirkungen auf die Indizierung sehr großer Felder - das ist definitiv zu beachten. Der Aufwand beim Ändern einer Anwendung, weil Sie zu wenig Speicherplatz zugewiesen haben, ist weitaus größer als die Kosten einiger zusätzlicher Bytes in Ihrer Datenbanktabelle.
Neville Kuyt
3
Ich denke, Speicher zu ignorieren, weil er billig ist, ist eine schlechte Idee. Jedes Byte auf der Festplatte muss abgerufen und verarbeitet werden, und der langsamste Teil fast jeder SQL Server-Installation ist der Festplattenspeicher. Weniger Bytes = schnellere Abfragen.
JNK
1
Wenn die 100 MB dazu führen, dass 20% weniger Daten in einen 512 MB großen Festplattencontroller-Cache passen, ist dies absolut wichtig (Voice of Experience).
Eric J.

Antworten:

16

Wenn Sie über varcharund nvarchardann nein sprechen , gibt es keine Strafe für das Zulassen einer höheren Feldlänge.


Einige Vorbehalte zu beachten:

  • Es gibt einen 2-Byte-Overhead pro Zeile für Felder mit variabler Länge (pro Feld). Wenn Sie ein sehr kurzes Feld haben, ist es möglicherweise sinnvoller, a zu verwenden CHAR. Varchar(2)Zum Beispiel werden tatsächlich zwischen 2 und 4 Bytes pro Zeile verwendet, während CHAR(2)immer 2 verwendet werden.
  • Sehr lange Felder können nicht indiziert werden. Die maximale Länge für alle Felder in einem Indexschlüsselsatz beträgt 900 Byte.
  • Wenn Sie mehr Daten zulassen als erwartet, erhalten Sie möglicherweise unerwartete Ergebnisse. Wenn Sie 100 Zeichen für einen Straßennamen zulassen, werden wahrscheinlich irgendwann andere Daten in dieses Feld gelangen, ohne dass Sie sich dessen bewusst sind (z. B. die gesamte Adresse). Wenn Sie eine angemessene Größe hätten, würden Sie wahrscheinlich stattdessen beim Einfügen einen Fehler erhalten.
  • Das Zulassen sehr breiter Zeilen kann zu Seitenteilen und Fragmentierung führen. Wenn Sie eine Zeile haben, die länger als 8 KB ist, muss diese auf mehrere Datenseiten aufgeteilt werden. Viele davon können die Leistung wirklich beeinträchtigen. Enger ist im Allgemeinen effizienter.
JNK
quelle
1
Sie können dieser Antwort auch Einschränkungen beim Kürzen hinzufügen, z. B. stellen Sie sicher, dass die Spalte mindestens groß genug ist: Die Adresse varchar (30) kann den Bolderwood Arboretum Ornamental Drive oder den Northeast Kentucky Industrial Parkway nicht bewältigen .
@ Aleksi - sehr wahr. Ich denke, diese sind jedoch offensichtlicher, weshalb OP zunächst breite Felder verwendet.
JNK
"Irgendwann werden wahrscheinlich andere Daten in dieses Feld gelangen, ohne dass Sie sich dessen bewusst sind." Ein interessanter Punkt. Ich habe viele Systeme gesehen, in denen Benutzer ein Feld, das für den vorliegenden Datensatz nicht zutreffend war, als allgemeines Kommentarfeld verwendet haben.
2
Es kann eine Strafe geben
Martin Smith
2

Wenn Sie meinen: "Gibt es eine Strafe für die Deklaration der Feldgröße, die größer ist als die tatsächlich darin gespeicherten Werte?", Lautet die Antwort Nein, solange sie als varchar deklariert ist. Jede mir bekannte SQL DB-Engine speichert nur die Anzahl der tatsächlich in den Daten angegebenen Zeichen (plus einen Längenwert). Wenn Sie das Feld also als varchar (100) definieren, aber nur 10 Zeichen darin speichern, werden nur 10 Zeichen auf der Festplatte belegt (plus etwa 2 Byte für die Länge). Im Zweifelsfall mache ich meine Varchar-Felder routinemäßig lächerlich groß.

Wenn Sie meinen: "Gibt es eine Strafe für das Speichern langer Zeichenfelder?", Lautet die Antwort "Ja". Speicherplatz ist heute billig, aber nicht kostenlos, sodass Sie ihn nicht ohne Grund verschwenden möchten. Wahrscheinlich wichtiger ist, dass das Lesen von Daten von der Festplatte einige Zeit in Anspruch nimmt. Je länger Ihre Datenfelder sind, desto langsamer wird das Programm. Wenn das Feld indiziert ist, kann dies Ihre Abfragen wirklich verlangsamen, da bei jedem Lesevorgang der Schlüsselwert mit diesem großen langen Feld verglichen werden muss.

Denken Sie daran, dass der Benutzer ein Big-Data-Eingabefeld früher oder später verwendet, wenn Sie es eingeben.

Alles in allem würde ich mich eher auf die Seite von zu groß als von zu klein irren. Der Speicherplatz ist so günstig, dass Sie Benutzer nicht zwingen müssen, Abkürzungen im laufenden Betrieb zu erfinden, da sie die realen Daten nicht in das verfügbare Feld einpassen können. Das System, an dem ich heute arbeite, verfügt über ein Produktbeschreibungsfeld, das für viele der tatsächlichen Namen unserer Produkte zu klein ist, sodass Benutzer abkürzen müssen. Und natürlich wird jeder Benutzer anders abgekürzt, sodass wir zwanzig verschiedene Möglichkeiten haben, dasselbe zu sagen.

Jay
quelle
2

Jeder, der behauptet, dass es keine Strafe gibt, wenn er ein Feld deklariert, das größer ist als das, was tatsächlich in der Tabelle gespeichert wird, ist falsch. Die tatsächliche Größe der Daten (plus der 2-Byte-Overhead) wird tatsächlich gespeichert, aber es ist die Spaltendefinition, die verwendet wird, um die Schätzung für den Ausführungsplan zu bestimmen. Während das Deklarieren eines Varchars (1000) zum Speichern eines 10-Zeichen-Werts nur 12 Zeichen Speicherplatz verbraucht, sind die Schätzungen des Ausführungsplans viel weniger effizient und die Ergebnisse werden negativ verzerrt, sowohl hinsichtlich der Speicherkapazität für die Operation als auch hinsichtlich der Speicherkapazität ob der Vorgang nur im Speicher ausgeführt werden kann oder ob auch temporärer Speicherplatz für das Laufwerk erforderlich ist. Sie können Ihre Spalte varchar (1000) erstellen, aber die Engine weiß nicht, dass alle Ihre gespeicherten Werte wirklich kleiner als varchar (10) sind.

Jim
quelle
0

Die Überprüfung der Feldlänge ist "kostenlos", dh Sie müssen keine CHECKEinschränkung verwenden, um dasselbe zu tun. Und Sie möchten keine übergroßen Datenwerte, wenn Sie beispielsweise Ihre Daten in eine andere Datenbank hochladen müssen, die dasselbe Datenelement gemäß der internationalen Standardadresse auf 35 Zeichen beschränkt hat.

eines Tages, wenn
quelle