Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Gibt es einen Vorteil für varchar(500) gegenüber varchar(8000)?

Ein Beispiel, wo dies einen Unterschied machen kann, ist, dass es eine Leistungsoptimierung verhindern kann, die das Hinzufügen von Zeilenversionsinformationen zu Tabellen mit After-Triggern vermeidet.

Dies wird hier von Paul White abgedeckt

Die tatsächliche Größe der gespeicherten Daten ist unerheblich – entscheidend ist die potenzielle Größe.

Ebenso war es bei der Verwendung von speicheroptimierten Tabellen seit 2016 möglich, LOB-Spalten oder Kombinationen von Spaltenbreiten zu verwenden, die möglicherweise das Inrow-Limit überschreiten könnten, jedoch mit einem Nachteil.

(Max) Spalten werden immer Off-Row gespeichert. Wenn bei anderen Spalten die Datenzeilengröße in der Tabellendefinition 8.060 Byte überschreiten kann, verschiebt SQL Server die größte(n) Spalte(n) mit variabler Länge außerhalb der Zeile. Auch hier kommt es nicht auf die Menge der Daten an, die Sie dort speichern.

Dies kann sich stark negativ auf den Speicherverbrauch und die Leistung auswirken

Ein weiterer Fall, in dem das Überdeklarieren von Spaltenbreiten einen großen Unterschied machen kann, ist, ob die Tabelle jemals mit SSIS verarbeitet wird. Der für Spalten mit variabler Länge (nicht BLOB) zugewiesene Speicher ist für jede Zeile in einem Ausführungsbaum festgelegt und entspricht der deklarierten maximalen Länge der Spalten, was zu einer ineffizienten Nutzung von Speicherpuffern führen kann (Beispiel). Während der SSIS-Paketentwickler eine kleinere Spaltengröße als die Quelle deklarieren kann, wird diese Analyse am besten im Voraus durchgeführt und dort durchgesetzt.

Zurück in der SQL Server-Engine selbst liegt ein ähnlicher Fall vor, wenn die Speicherzuweisung für SORT berechnet wird Operationen SQL Server geht davon aus, dass varchar(x) Spalten verbrauchen im Durchschnitt x/2 Bytes.

Wenn die meisten Ihrer varchar Spalten voller sind, als dass dies zum sort führen kann Operationen, die zu tempdb überlaufen .

In Ihrem Fall, wenn Ihr varchar Spalten werden als 8000 deklariert Bytes, aber tatsächlich viel weniger Inhalt haben, als dass Ihrer Abfrage Speicher zugewiesen wird, den sie nicht benötigt, was offensichtlich ineffizient ist und zu Wartezeiten auf Speicherzuweisungen führen kann.

Dies wird in Teil 2 des SQL Workshops Webcast 1 behandelt, der hier heruntergeladen werden kann oder unten steht.

use tempdb;

CREATE TABLE T(
id INT IDENTITY(1,1) PRIMARY KEY,
number int,
name8000 VARCHAR(8000),
name500 VARCHAR(500))

INSERT INTO  T 
(number,name8000,name500)
SELECT number, name, name /*<--Same contents in both cols*/
FROM master..spt_values

SELECT id,name500
FROM T
ORDER BY number

SELECT id,name8000
FROM T
ORDER BY number