Przeczytałem o tym na forach MSDN i tutaj i nadal nie jestem pewien. Myślę, że to jest poprawne: Varchar (max) będzie przechowywany jako typ danych tekstowych, więc ma wady. Powiedzmy więc, że Twoje pole będzie niezawodnie zawierać mniej niż 8000 znaków. Podobnie jak pole BusinessName w mojej tabeli bazy danych. W rzeczywistości nazwa firmy będzie prawdopodobnie zawsze składać się z (wyciągając numer z mojego kapelusza) 500 znaków. Wygląda na to, że wiele pól varchar, na które natrafiam, mieści się znacznie poniżej 8 tys. Znaków.
Czy powinienem więc uczynić to pole varchar (500) zamiast varchar (8000)? Z tego, co rozumiem w SQL, nie ma różnicy między tymi dwoma. Aby ułatwić sobie życie, chciałbym zdefiniować wszystkie moje pola varchar jako varchar (8000). Czy to ma jakieś wady?
Powiązane: Rozmiar kolumn varchar (nie czułem, że ten odpowiedział na moje pytanie).
źródło
Odpowiedzi:
Z punktu widzenia przetwarzania nie będzie miało znaczenia użycie varchar (8000) vs varchar (500). To raczej rodzaj „dobrej praktyki”, aby zdefiniować maksymalną długość, jaką pole powinno pomieścić i uczynić varchar taką długością. Jest to coś, co może być pomocne przy sprawdzaniu poprawności danych. Na przykład, nadanie skrótu stanu składającego się z 2 znaków lub kodu pocztowego / pocztowego jako 5 lub 9 znaków. Kiedyś było to ważniejsze rozróżnienie, gdy dane wchodziły w interakcję z innymi systemami lub interfejsami użytkownika, w których długość pola była krytyczna (np. Zestaw danych z płaskim plikiem mainframe), ale obecnie myślę, że jest to bardziej przyzwyczajenie niż cokolwiek innego.
źródło
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
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ą.
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, żevarchar(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 przeniesieniasort
operacji dotempdb
.W twoim przypadku, jeśli twoje
varchar
kolumny są zadeklarowane jako8000
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 /*<--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
źródło
char(4)
ponieważ i tak jest 2 bajty narzutu na kolumnę zmiennej.Oprócz najlepszych praktyk (odpowiedź BBlake'a)
źródło
nvarchar
ivarchar
typów oznacza to tylko, że końcowe spacje są zachowywane po wstawieniu - a nie, że wartości są dopełniane spacjami do rozmiaru kolumny, jak wchar
inchar
.Duże kolumny mają pewne wady, które są nieco mniej oczywiste i mogą Cię złapać nieco później:
Zasadniczo staraj się zachować ostrożność przy szerokości kolumny. Jeśli stanie się problemem, możesz go łatwo rozszerzyć, aby dopasować go do potrzeb. Jeśli później zauważysz problemy z pamięcią, późniejsze zmniejszenie szerokiej kolumny może stać się niemożliwe bez utraty danych i nie będziesz wiedział, od czego zacząć.
W swoim przykładzie nazw firm zastanów się, gdzie możesz je wyświetlać. Czy naprawdę jest miejsce na 500 znaków? Jeśli nie, przechowywanie ich jako takich nie ma sensu. http://en.wikipedia.org/wiki/List_of_companies_of_the_United_States zawiera listę niektórych nazw firm, przy czym maksymalna długość to około 50 znaków. Więc użyłbym 100 dla kolumny max. Może bardziej jak 80.
źródło
Idealnie byłoby, gdybyś chciał zejść mniej niż to, do rozsądnej długości (500 nie ma rozsądnego rozmiaru) i upewnić się, że weryfikacja klienta złapie, gdy dane będą zbyt duże i wyślą użyteczny błąd.
Podczas gdy varchar w rzeczywistości nie rezerwuje miejsca w bazie danych na niewykorzystane miejsce, przypominam sobie, że wersje SQL Server miały problem z wierszami bazy danych, które są szersze niż pewna liczba bajtów (nie pamiętam dokładnej liczby) i faktycznie wyrzucały wszelkie dane nie pasowały. Pewna liczba tych bajtów była zarezerwowana dla elementów wewnętrznych SQL Server.
źródło