Jednym z przykładów, w których może to mieć znaczenie, jest to, że może uniemożliwić optymalizację wydajności, która pozwala uniknąć dodawania informacji o wersji wierszy do tabel z wyzwalaczami after.
Omówił to tutaj Paul White
Rzeczywisty rozmiar przechowywanych danych jest nieistotny – liczy się potencjalny rozmiar.
Podobnie, jeśli używasz 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 potencjalnie mogłyby przekroczyć limit wrzutów, ale z karą.
(Maksymalnie) kolumny są zawsze przechowywane poza wierszem. 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 wiersz. 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 deklarowanie 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 (nie typu BLOB) jest stała dla każdego wiersza w drzewie wykonania i odpowiada zadeklarowanej maksymalnej długości kolumn, co może prowadzić do nieefektywnego wykorzystania buforów pamięci (przykład). Podczas gdy deweloper pakietu SSIS może zadeklarować mniejszy rozmiar kolumny niż źródło, tę analizę najlepiej przeprowadzić z góry i tam egzekwować.
W przypadku samego silnika SQL Server podobny przypadek jest taki, że podczas obliczania przyznanej pamięci do przydzielenia dla SORT
operacje SQL Server zakłada, że varchar(x)
kolumny będą zużywać średnio x/2
bajtów.
Jeśli większość twojego varchar
kolumny są pełniejsze niż może to prowadzić do sort
operacje rozlewają się do tempdb
.
W Twoim przypadku, jeśli Twój varchar
kolumny są zadeklarowane jako 8000
bajtów, ale w rzeczywistości mają zawartość znacznie mniejszą niż ta, na którą twoje zapytanie zostanie przydzielone pamięci, której nie wymaga, co jest oczywiście nieefektywne i może prowadzić do oczekiwania na przyznanie pamięci.
Zostało to omówione w części 2 programu SQL Workshops Webcast 1, który można pobrać stąd lub 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 /*<--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