Wie wirken sich lange Spalten auf die Leistung und die Datenträgernutzung aus?


26

In unserem aktuellen Projekt kommt es einfach zu oft vor, dass wir Spalten um ein paar Zeichen erweitern müssen. Von varchar(20)bis varchar(30)und so weiter.

Wie wichtig ist es in Wirklichkeit? Wie gut ist das optimiert? Wie wirkt es sich aus, wenn nur 100 oder 200 oder sogar 500 Zeichen für normale "Eingabefelder" zugelassen werden? Eine E-Mail kann nur 320 Zeichen enthalten. Es gibt also ein gutes Limit. Aber was bringt es mir, wenn ich 200 einstelle, weil ich keine längeren E-Mail-Adressen als diese erwarte.

Normalerweise haben unsere Tabellen nicht mehr als 100.000 Zeilen und bis zu 20 oder 30 solcher Spalten.

Wir verwenden jetzt SQL Server 2008, aber es wäre interessant zu wissen, wie verschiedene DBs mit diesem Problem umgehen.

Falls die Auswirkungen sehr gering sind - wie ich es erwarten würde, wäre es hilfreich, einige gute Argumente (mit Links belegt?) Zu erhalten, um meinen DBA davon zu überzeugen, dass diese Langfeld-Paranoia nicht wirklich notwendig ist.

Falls es so ist, ich bin hier um zu lernen :-)

Antworten:


12

Die spezifische Antwort auf Ihre Frage (zumindest für Oracle und wahrscheinlich andere Datenbanken) ist, dass die Länge des Feldes keine Rolle spielt, nur die Länge der Daten. Dies sollte jedoch nicht als bestimmender Faktor dafür herangezogen werden, ob das Feld auf die maximal zulässige Länge eingestellt werden soll oder nicht. Hier sind einige andere Punkte, die Sie berücksichtigen sollten, bevor Sie die Feldgröße maximieren.

Formatierung Jedes Client-Tool, das die Daten basierend auf der Größe der Felder formatiert, erfordert spezielle Überlegungen zur Formatierung. Beispielsweise zeigt SQL * Plus von Oracle standardmäßig die maximale Größe von Varchar2-Spalten an, auch wenn die Daten nur ein Zeichen lang sind. Vergleichen Sie…

create table f1 (a varchar2(4000), b varchar2(4000));
create table f2 (a varchar2(5), b varchar2(5));
insert into f1 values ('a','b');
insert into f2 values ('a','b');
select * from f1;
select * from f2;

Schlechte Datenfeldlänge bietet einen zusätzlichen Mechanismus zum Auffangen / Verhindern von schlechten Daten. Eine Schnittstelle sollte nicht versuchen, 3000 Zeichen in ein Feld mit 100 Zeichen einzufügen. Wenn dieses Feld jedoch mit 4000 Zeichen definiert ist, ist dies möglicherweise der Fall. Der Fehler wurde bei der Dateneingabe nicht abgefangen, aber das System kann weiter unten Probleme haben, wenn eine andere Anwendung versucht, die Daten und Drosseln zu verarbeiten. Wenn Sie sich beispielsweise später entscheiden, das Feld in Oracle zu indizieren, überschreiten Sie die maximale Schlüssellänge (abhängig von Blockgröße und Verkettung). Sehen…

create index i1 on f1(a);

Arbeitsspeicher Wenn die Clientanwendung Arbeitsspeicher mit der maximalen Größe zuweist, würde die Anwendung erheblich mehr Arbeitsspeicher zuweisen, als erforderlich ist. Um dies zu vermeiden, müssten besondere Überlegungen angestellt werden.

Dokumentation Die Größe des Feldes bietet einen weiteren Datenpunkt für die Dokumentation der Daten. Wir könnten alle Tabellen t1, t2, t3 usw. und alle Felder f1, f2, f3 usw. aufrufen, aber indem wir aussagekräftige Namen angeben, verstehen wir die Daten besser. Wenn beispielsweise eine Adresstabelle für ein Unternehmen mit Kunden in den USA ein Feld mit der Bezeichnung "Bundesstaat" enthält, das aus zwei Zeichen besteht, wird erwartet, dass die Abkürzung für den Bundesstaat aus zwei Zeichen enthalten ist. Auf der anderen Seite können wir erwarten, dass der vollständige Statusname in das Feld aufgenommen wird, wenn das Feld 100 Zeichen enthält.


Trotzdem scheint es ratsam, auf Veränderungen vorbereitet zu sein. Nur weil alle Ihre heutigen Produktnamen aus 20 Zeichen bestehen, bedeutet dies nicht, dass dies immer der Fall ist. Gehen Sie nicht über Bord und machen Sie es 1000, sondern lassen Sie Platz für eine plausible Erweiterung.



Die Dokumentation ist eine nette, die Sie hier hinzugefügt haben und die ich sonst nirgends gesehen habe.
Jeteon

9

Hier ist ein guter Ausgangspunkt für Sie.

http://www.sqlskills.com/BLOGS/KIMBERLY/post/Disk-space-is-cheap.aspx

Möglicherweise habe ich Ihre ursprüngliche Frage falsch verstanden. Lassen Sie mich sehen, ob ich Ihnen ein paar andere Links als Referenz zur Verfügung stellen kann.

Hier finden Sie eine gute Referenz zur Auswahl von Datentypen: http://sqlfool.com/2009/05/performance-considerations-of-data-types/

Der Wechsel von varchar (20) zu varchar (30) mag klein erscheinen, aber Sie müssen mehr über die Funktionsweise von Datenbankstrukturen wissen, um die potenziellen Probleme zu erkennen. Wenn Sie beispielsweise zu varchar (30) wechseln, können Sie den Wendepunkt Ihrer Spalten überschreiten (sollten alle 30 Byte belegt sein) und auf einer Seite gespeichert werden (weniger als 8060 Byte). Dies führt zu einer Zunahme des verwendeten Speicherplatzes, einer Abnahme der Leistung und sogar zu zusätzlichem Overhead bei Ihren Transaktionsprotokollen.

Hier ist ein Link für Datenbankstrukturen: http://technet.microsoft.com/en-us/sqlserver/gg313756.aspx

Hier ist eine für Seitenaufteilungen und Trx-Protokollierung: http://sqlskills.com/BLOGS/PAUL/post/How-expensive-are-page-splits-in-terms-of-transaction-log.aspx

HTH


7

Ich dachte, ich würde einen anderen interessanten Punkt teilen, den ich in der folgenden SO-Frage fand:

https://stackoverflow.com/questions/148398/sind-jegliche-Nachteile-im-mer-Mit-nvarcharmax

Originalantwort von: Nick Kavadias

Ein Grund, Max- oder Textfelder NICHT zu verwenden, besteht darin, dass Sie keine [Online-Indexneubildungen] [1] durchführen können, dh REBUILD WITH ONLINE = ON, selbst mit SQL Server Enterprise Edition.

[1]: http://msdn.microsoft.com/en-us/library/ms188388%28SQL.90%29.aspx " Neuerstellung des Online-Index"

Ich würde dies als großen Nachteil betrachten, wenn ich willkürlich n / varchar (max) -Spalten hinzufüge, und laut MS Site bleibt diese Einschränkung gegen Online-Indexneuerstellungen in SQL Server 2008, 2008 R2 und Denali bestehen. Es ist also nicht spezifisch für SQL Server 2005.

Danke, Jeff


6

In einigen Fällen wirkt sich der für ein varchar-Feld zugewiesene Speicherplatz auf die für speicherinterne Sortierungen zugewiesene Speicherkapazität aus.

Ich fand die Präsentationen auf SQLWorkshops.com nachdenklich. Diese Präsentation handelt von einem Fall, in dem eine Sortierung für eine Bestellung von in tempdb übergeht, weil nicht genügend Speicher für char / varchar-Felder zugewiesen wird.

http://webcasts2.sqlworkshops.com/webcasts.asp

Dieser Webcast wurde auch als Artikel auf der folgenden Website vorgestellt:

http://www.mssqltips.com/tip.asp?tip=1955

Beachten Sie in dieser Präsentation, dass es sich bei der Spalte, nach der sortiert wird, nicht um die Spalte char / varchar handelt. In einigen Fällen wirkt sich jedoch der für die Spalte varchar im Speicher zugewiesene Speicherplatz auf die Abfrageleistung aus.


4

ANSI_PADDING EINSTELLEN?

Sie landen mit viel Leerzeichen am Ende ...


3

Es spielt nur eine Rolle in Bezug auf Speicherplatz und Zeichenlänge. Natürlich wird die Suche nach char-Datentypen und Indizes für diesen Datentyp langsamer als Ganzzahlen, aber dies ist eine andere Diskussion.

Der Varchar-Datentyp ist ein "variabler" Datentyp. Wenn Sie also ein Limit von varchar (500) festlegen, ist dies die maximale Zeichenlänge für dieses Feld. Die Mindestlänge kann zwischen 0 und 500 liegen. Andererseits ist der beanspruchte Speicherplatz für 10, 30 oder 500 Zeichenfelder unterschiedlich.

Ich habe manchmal einen Test für den Datentyp varchar (800) und für Nullwerte durchgeführt, bei dem 17 Bytes verwendet wurden, und für jedes eingefügte Zeichen wurde ein weiteres Byte hinzugefügt. Beispielsweise wurden in einer 400-Zeichen-Zeichenfolge 417 Bytes auf der Festplatte verwendet.


3

Ich glaube nicht, dass es einen Unterschied zwischen Tabellen gibt, die mit Spalten von varchar (20) oder varchar ((8000) erstellt wurden, solange die tatsächliche maximale Länge <= 20 ist.

Auf der anderen Seite kann es in einigen Fällen hilfreich sein, den Benutzern die Möglichkeit zu geben, längere Zeichenfolgen zu speichern.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.