Verwenden Sie eine viel größere Spalte als erforderlich

16

Ich erstelle eine SQL Server-Datenbank mit jemand anderem. Eine der Tabellen ist klein (6 Zeilen) und enthält Daten, die wahrscheinlich konstant bleiben. Es besteht eine entfernte Möglichkeit, dass eine neue Zeile hinzugefügt wird. Die Tabelle sieht ungefähr so ​​aus:

CREATE TABLE someTable (
    id int primary key identity(1,1) not null,
    name varchar(128) not null unique
    );
INSERT INTO someTable values ('alice', 'bob something', 'charles can dance', 'dugan was here');

Ich schaue auf die Zeichenlänge dieser nameSpalte und denke, dass ihre Werte wahrscheinlich niemals größer als 32 Zeichen, vielleicht sogar nicht größer als 24, sein werden. zum Beispiel varchar(32)?

Hat es auch einen Vorteil, die Standardspaltengrößen auf ein Vielfaches von 4, 8, 32 usw. zu beschränken?

Elbillaf
quelle

Antworten:

15

SQL Server verwendet Spaltenlängen beim Zuweisen von Speicher für die Abfrageverarbeitung. Also, ja, kurz gesagt, Sie sollten die Spalten immer entsprechend der Datengröße anpassen.

Die Speicherzuweisungen basieren auf der Anzahl der von der Abfrage zurückgegebenen Zeilen multipliziert mit der Hälfte der angegebenen Länge der Spalte.

In diesem Fall, in dem Sie 6 Zeilen haben, möchten Sie wahrscheinlich nicht vorzeitig überoptimieren. Wenn Sie diese Tabelle nicht mit Millionen von Zeilen verbinden, gibt es keinen großen Unterschied zwischen einem Varchar (24) und einem Varchar (32) oder sogar einem Varchar (128).

In Ihrer zweiten Frage geht es darum, Spaltenlängen an binären Vielfachen auszurichten. Dies ist überhaupt nicht erforderlich, da SQL Server alle Daten auf 8 KB-Seiten speichert, unabhängig von der Länge der einzelnen Spalten.

Max Vernon
quelle
14

Bei 6 Zeilen gibt es keinen erkennbaren Vorteil. Die gesamte Tabelle passt auf eine einzelne Seite, sodass die Reduzierung des maximal möglichen Speicherplatzes, den Sie auf dieser Seite benötigen, während die gesamte Seite belegt ist, praktisch nicht anders ist.

Bei größeren Tabellen ist jedoch die richtige Größe von entscheidender Bedeutung. Der Grund dafür ist, dass Speicherschätzungen auf der Annahme basieren, dass jeder Wert zu 50% gefüllt ist. Wenn Sie also varchar (128) haben, wird erwartet, dass jeder Wert unabhängig von den tatsächlichen Daten 64 Bytes belegt. Daher beträgt die Speicherzuweisung 64b * Anzahl der Zeilen. Wenn alle Werte 32 Zeichen oder weniger enthalten, ist es wahrscheinlich die bessere Wahl, varchar (64) oder gar varchar (32) zu verwenden. Wenn ein großer Prozentsatz der Werte in der Nähe oder am Limit liegt, können Sie sogar dafür argumentieren, dass char die Volatilität verringert.

Was die Vorteile der Begrenzung der Stringlänge auf Potenzen von 2 angeht, denke ich, dass bei der heutigen Hardware niemand offensichtliche Vorteile nachweisen kann.

Aaron Bertrand
quelle