Czy zawsze powinienem używać (n)varchar(max)
do kolumn tekstowych?
Nie.
W przypadku SQL Server max
typy danych należy określać tylko wtedy, gdy nie ma alternatywy. Zamiast tego należy wybrać prawidłowy typ podstawowy ( varchar
lub nvarchar
) i określić jawną maksymalną długość odpowiednią dla przechowywanych danych.
Pamięć fizyczna jest identyczna bez względu na to, czy kolumna jest wpisana jako varchar(n)
czy varchar(max)
, więc nie jest to problemem.
Powody, dla których nie(n)varchar(max)
wszędzie wybierasz, dotyczą głównie funkcji, jakości planu i wydajności.
Wyczerpująca lista prawdopodobnie nie jest praktyczna, ale między innymi max
kolumny:
cechy
- Wymagaj osobnego ograniczenia w celu wymuszenia maksymalnej długości
- Nie może być kluczem w indeksie (więc nie ma też unikalnych ograniczeń)
- Może uniemożliwić DDL online (w tym przebudowy indeksu i dodanie nowej kolumny innej niż null)
- Na ogół nie są obsługiwane dla „nowszych” funkcji, np. Magazynu kolumn
- Bardziej szczegółowe funkcje i ograniczenia można znaleźć w dokumentacji produktu. Ogólny wzorzec jest taki, że istnieją dziwne ograniczenia i ograniczenia
max
dotyczące typów danych. Nie wszystkie ograniczenia i skutki uboczne są udokumentowane.
Wydajność
- Wymagaj specjalnej obsługi w silniku wykonywania, aby uwzględnić potencjalnie bardzo duży rozmiar. Zazwyczaj wymaga to użycia mniej wydajnej ścieżki kodu z interfejsem przesyłania strumieniowego
- Może mieć podobne nieoczekiwane konsekwencje dla zewnętrznego kodu (i innych składników SQL Server, takich jak SSIS), które muszą być również przygotowane do obsługi danych o wielkości do 2 GB
- Przyjmuje się, że mają 4000 bajtów szerokości w obliczeniach przyznania pamięci. Może to prowadzić do nadmiernej rezerwacji pamięci, co ogranicza współbieżność i wypycha cenne strony indeksu i danych z pamięci podręcznej
- Wyłącz kilka ważnych optymalizacji wydajności
- Może wydłużyć czas blokady
- Może uniemożliwić optymalizatorowi wybranie (niedynamicznego) planu wyszukiwania
- Zapobiegaj popychaniu filtrów do skanów i szuka jako pozostałości
- Może zwiększać ciśnienie i rywalizację tempdb (zależnie od wersji), ponieważ zmienne i parametry mogą być również wpisywane w
max
celu dopasowania definicji kolumn
Podsumowując, istnieje tak wiele subtelnych (i niepożądanych) skutków ubocznych niepotrzebnego używania max
specyfikatora, że nie ma sensu tego robić. Drobna „wygoda” korzystania z jednej deklaracji nie stanowi żadnej rekompensaty.
Oceń każdy typ w kontekście, użyj prawidłowego typu podstawowego ( varchar
lub nvarchar
) i rozsądnej wyraźnej długości.
Dalsza lektura:
Paul White mówi GoFundMonica
źródło
varchar(not-max)
parametry, więc trochę utknąłem tutaj w ustach. Ale tak, zastrzyk SQL miałby tu zastosowanie. Być może powinienem nieco sformułować tę odpowiedź.