Ein Beispiel, bei dem dies einen Unterschied machen kann, besteht darin, dass eine Leistungsoptimierung verhindert werden kann, bei der vermieden wird, dass Tabellen mit After-Triggern Informationen zur Zeilenversionierung hinzugefügt werden.
Dies wird hier von SQL Kiwi behandelt
Die tatsächliche Größe der gespeicherten Daten spielt keine Rolle - es kommt auf die potenzielle Größe an.
In ähnlicher Weise war es bei Verwendung speicheroptimierter Tabellen seit 2016 möglich, LOB-Spalten oder Kombinationen von Spaltenbreiten zu verwenden, die möglicherweise die Eingangsgrenze überschreiten könnten, jedoch mit einer Strafe verbunden sind.
(Max) Spalten werden immer außerhalb der Zeile gespeichert. Wenn für andere Spalten die Datenzeilengröße in der Tabellendefinition 8.060 Byte überschreiten kann, schiebt SQL Server die größten Spalten variabler Länge aus der Zeile. Auch hier hängt es nicht von der Menge der Daten ab, 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 angegebenen maximalen Länge der Spalten, was zu einer ineffizienten Verwendung 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 ist ein ähnlicher Fall, dass SQL Server bei der Berechnung der Speicherzuweisung für Zuweisungen für SORT
Operationen davon ausgeht, dass varchar(x)
Spalten im Durchschnitt x/2
Bytes verbrauchen .
Wenn die meisten Ihrer varchar
Spalten voller sind, kann dies dazu führen, dass die sort
Vorgänge ausgeführt werden tempdb
.
In Ihrem Fall, wenn Ihre varchar
Spalten als 8000
Bytes deklariert sind, aber tatsächlich einen Inhalt haben, der viel geringer ist als der, wird Ihrer Abfrage Speicher zugewiesen, den sie nicht benötigt, was offensichtlich ineffizient ist und zu Wartezeiten auf Speicherzuweisungen führen kann.
Dies wird in Teil 2 von SQL Workshops Webcast 1 behandelt, der hier heruntergeladen werden kann oder siehe unten.
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