7 Stimmen

Gibt es einen Grund für die Verwendung von Base2-Längen für Spalten in SQL Server?

Mögliche Duplikate:
varchar-Felder - Ist eine Zweierpotenz effizienter?
Nvarchar oder varchar, was ist besser verwenden Multiplikation von 2 oder gerundet volle Zahlen?

Aus reiner Gewohnheit definiere ich die Größen der Spalten, die ich in SQL Server verwende, als Base2-Größen. Hier ist zum Beispiel eine Tabelle, an der ich gerade arbeite:

  1. ID int
  2. Vorname nvarchar(64)
  3. Nachname nvarchar(64)
  4. Col4 varchar(16)
  5. Col5 nvarchar(32)
  6. Spalte6 nvarchar(128)
  7. usw...

Ich habe keine Ahnung, woher diese Angewohnheit kommt, und ich bin mir nicht sicher, ob sie überhaupt Sinn macht. Wäre die folgende Tabellendefinition in irgendeiner Weise weniger effizient als die obige?

  1. ID int
  2. Vorname nvarchar(50)
  3. Nachname nvarchar(50)
  4. Col4 varchar(10)
  5. Col5 nvarchar(30)
  6. Spalte6 nvarchar(100)
  7. usw...

Ich denke, meine wichtigste Frage ist: gibt es irgendwelche legitimen Gründe für die Verwendung von Base2 Spaltenlängen?

0 Stimmen

0 Stimmen

Gute Funde @gbn, ich schätze, das ist eine Fälschung

0 Stimmen

Ich kann nicht glauben, dass diese Frage mehrere Duplikate hat

4voto

Joe Stefanelli Punkte 128819

Es gibt keinen Grund, dies zu tun, insbesondere bei (n)varchar-Daten, bei denen die Speichergröße der tatsächlichen Länge der Daten + 2 Byte entspricht.

4voto

HLGEM Punkte 91543

Wenn Sie Spalten größer machen, als sie sein müssen, kann das Ihrem Datenbankdesign aktiv schaden. Von BOL:

Eine Tabelle kann maximal 8.060 Bytes pro Zeile enthalten. In SQL Server 2008 ist diese Beschränkung für Tabellen, die Spalten vom Typ varchar, nvarchar, varbinary, sql_variant oder CLR benutzerdefiniert enthalten, gelockert....Das Überschreiten der 8.060-Byte-Zeilengröße kann sich auf die Leistung auswirken, da SQL Server immer noch ein Limit von 8 KB pro Seite beibehält. Wenn eine Kombination von varchar-, nvarchar-, varbinary-, sql_variant- oder CLR-benutzerdefinierten Typspalten diese Grenze überschreitet, verschiebt die SQL Server-Datenbank-Engine die Datensatzspalte mit der größten Breite auf eine andere Seite in der Zuordnungseinheit ROW_OVERFLOW_DATA, während ein 24-Byte-Zeiger auf der ursprünglichen Seite beibehalten wird. Das Verschieben großer Datensätze auf eine andere Seite erfolgt dynamisch, wenn Datensätze aufgrund von Aktualisierungsvorgängen verlängert werden. Aktualisierungsvorgänge, die Datensätze verkürzen, können dazu führen, dass Datensätze zurück auf die ursprüngliche Seite in der Zuordnungseinheit IN_ROW_DATA verschoben werden. Außerdem verlangsamen Abfragen und andere Auswahloperationen wie Sortierungen oder Joins bei großen Datensätzen, die Zeilenüberlaufdaten enthalten, die Verarbeitungszeit, da diese Datensätze synchron statt asynchron verarbeitet werden.

Ich habe die Erfahrung gemacht, dass, wenn man ihnen die zusätzliche Größe gibt, sie sie früher oder später auch nutzen. Wenn Sie außerdem etwas als varchar (64) festlegen, obwohl Sie nur maximal 10 Zeichen benötigen, erhöhen Sie die Wahrscheinlichkeit, dass jemand das Feld für einen anderen als den beabsichtigten Zweck verwendet, und Sie werden feststellen, dass Sie schlechte Daten in diesen Feldern erhalten (z. B. ein Telefonnummernfeld, das Notizen über die zu kontaktierende Sekretärin enthält, um ein nicht ganz zufälliges Beispiel zu wählen).

Aber zumindest ist dieser Entwurf viel besser als alles nvarchar (max) zu machen.

0 Stimmen

Varchar(64) anstelle von varchar(10) ist ein schlechtes Beispiel, da in diesem Fall varchar(16) verwendet worden wäre, wodurch nur 4 Byte Speicherplatz verschwendet werden. varchar(512) anstelle von varchar(300) wäre ein besseres Beispiel für verschwendeten Speicherplatz, der missbraucht werden könnte, um eine Menge zusätzlicher Daten zu speichern, die nicht für diese Spalte gedacht waren.

0 Stimmen

US-Telefonnummern werden häufig in varchar (10) gespeichert - 3 Ziffern für die Ortsvorwahl, 3 Ziffern für die Vorwahl und 4 Ziffern für die Nachwahl. Wenn Sie internationale Telefonnummern speichern müssen und die nichtnumerischen Teile der Nummer speichern, kann das anders sein.

1voto

marc_s Punkte 701497

Nein, es ist nur eine Angewohnheit von Programmierern, in 2er-Potenzen zu denken und zu handeln - es gibt definitiv keinen technischen Grund von SQL Server, dies zu tun - keine Geschwindigkeits- oder Leistungssteigerung oder etwas Ähnliches.

0voto

Ned Batchelder Punkte 342778

Das ist zweifelhaft. Zunächst einmal ist die genaue Länge der Spalten vor allem aus Gründen des eigenen Datenschemas von Bedeutung. Zweitens ist die Gesamtlänge aller Spalten wahrscheinlich das wichtigste Kriterium, wenn die Längen in die Effizienzberechnung einfließen, und selbst dann gibt es einen Buchhaltungsaufwand, der bedeutet, dass eine schöne runde Zahl wahrscheinlich nicht die beste Antwort ist.

So finden Sie vielleicht Ratschläge zur Begrenzung der Zeilengröße auf einen bestimmten Wert, so dass die gesamte Zeile auf eine Seite passt, oder etwas in dieser Richtung. Damit soll die Anzahl der Festplatten-E/As pro Datensatz verringert werden. Aber die einzelnen Spaltengrößen spielen keine Rolle, sondern die Gesamtzahl.

0voto

Mark Baker Punkte 204969

Es ist nicht speziell eine SQL SErver Frage... Ich tue dasselbe in Oracle und MySQL. Dafür gibt es keinen besonderen Grund, außer der Tatsache, dass ich mich vielleicht wohler fühle, wenn ich base2-Größen verwende.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X