Jednym z przykładów, w którym może to mieć znaczenie, jest to, że może zapobiec optymalizacji wydajności, która pozwala uniknąć dodawania informacji o wersji wierszy do tabel z wyzwalaczami after.
Jest to omówione tutaj w SQL Kiwi
Rzeczywisty rozmiar przechowywanych danych jest nieistotny - liczy się potencjalny rozmiar.
Podobnie w przypadku korzystania z tabel zoptymalizowanych pod kątem pamięci od 2016 r. Możliwe było użycie kolumn LOB lub kombinacji szerokości kolumn, które mogłyby potencjalnie przekroczyć limit inrow, ale z karą.
(Max) kolumny są zawsze przechowywane poza wierszami. W przypadku innych kolumn, jeśli rozmiar wiersza danych w definicji tabeli może przekroczyć 8060 bajtów, SQL Server wypycha największe kolumny o zmiennej długości poza wierszem. Ponownie, nie zależy to od ilości danych, które tam przechowujesz.
Może to mieć duży negatywny wpływ na zużycie pamięci i wydajność
Innym przypadkiem, w którym nadmierne zadeklarowanie szerokości kolumn może mieć duże znaczenie, jest to, czy tabela będzie kiedykolwiek przetwarzana przy użyciu usług SSIS. Pamięć przydzielona dla kolumn o zmiennej długości (innych niż BLOB) jest ustalona dla każdego wiersza w drzewie wykonywania i odpowiada zadeklarowanej maksymalnej długości kolumn, co może prowadzić do nieefektywnego wykorzystania buforów pamięci (przykład) . Chociaż deweloper pakietu SSIS może zadeklarować mniejszy rozmiar kolumny niż źródło, tę analizę najlepiej przeprowadzić z góry i tam wymusić.
W samym silniku SQL Server podobny przypadek jest taki, że podczas obliczania przydziału pamięci do przydzielenia SORT
operacji SQL Server zakłada, że varchar(x)
kolumny będą średnio zużywać x/2
bajty.
Jeśli większość twoich varchar
kolumn jest pełniejsza, może to doprowadzić do przeniesienia sort
operacji do tempdb
.
W twoim przypadku, jeśli twoje varchar
kolumny są zadeklarowane jako 8000
bajty, ale w rzeczywistości mają zawartość znacznie mniejszą niż ta, twoje zapytanie otrzyma pamięć, której nie wymaga, co jest oczywiście nieefektywne i może prowadzić do oczekiwania na przydziały pamięci.
Jest to omówione w części 2 prezentacji internetowej dotyczącej warsztatów SQL 1, którą można pobrać stąd lub patrz poniżej.
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
FROM master..spt_values
SELECT id,name500
FROM T
ORDER BY number
SELECT id,name8000
FROM T
ORDER BY number