Szerokość kolumny VARCHAR programu SQL Server


14

Przeszukując sieć, znalazłem sprzeczne porady na temat tego, czy ma wpływ na wydajność przy określaniu zbyt szerokich kolumn VARCHAR, np. VARCHAR (255), kiedy prawdopodobnie VARCHAR (30) to zrobi.

Konsekwentnie zgadzam się z opinią, że jeśli cały wiersz przekroczy 8060 bajtów, nastąpi spadek wydajności. Poza tym widzę spór.

Czy to twierdzenie jest prawdą The default is SET ANSI PADDING ON = potential for lots of trailing spaces? Dopóki całkowita szerokość wiersza jest mniejsza niż 8060, czy istnieją jakieś rzeczywiste problemy z wydajnością w przypadku zbyt dużych rozmiarów kolumn VARCHAR?

Dowody, że szerokość kolumny ma znaczenie


The same goes for CHAR and VARCHAR data types. Don’t specify more characters in character columns that you need.

http://www.sql-server-performance.com/2007/datatypes/


  • Length is a constraint on the data (like CHECK, FK, NULL etc)
  • Performance when the row exceeds 8060 bytes
  • Can not have unique constraint or index (key column width must be < 900)
  • The default is SET ANSI PADDING ON = potential for lots of trailing spaces

Jakie są konsekwencje ustawienia varchar (8000)?


Dowód, że szerokość kolumny NIE MA znaczenia


If you're talking about varchar and nvarchar then no, there is no penalty for allowing a higher field length.

/programming/7025996/overstating-field-size-in-database-design


The varchar datatype, by contrast, consumes only the amount of actual space used plus 2 bytes for overhead

http://sqlfool.com/content/PerformanceConsiderationsOfDataTypes.pdf


Odpowiedzi:


7

Pytanie to można lepiej sformułować jako:

„Jaka jest zaleta nadmiernego określenia maksymalnej długości kolumny o zmiennej długości?”

Ogólnie rzecz biorąc, ma to niewielką przewagę i kilka wad, jak wskazują różne powiązane odpowiedzi. Pomijając wszelkie inne obawy, weź pod uwagę, że SQL Server nie jest oprogramowaniem typu open source: istnieje wiele „magicznych liczb” i heurystyk stosowanych w oparciu o informacje przekazywane do systemu. Bez dostępu do kodu źródłowego nigdy nie bylibyśmy całkowicie pewni, jaki może być wpływ tej praktyki.

W niektórych przypadkach , gdy średnia długość kolumny jest znacznie wyższa niż 50% założone przez SQL Server podczas obliczania wielkości pamięci sortowania / mieszania, można zauważyć poprawę wydajności poprzez nadmierne określenie maksymalnej długości. Jest to wątpliwe obejście i prawdopodobnie powinno być stosowane wyłącznie przez jawne CASTlub CONVERT(z komentarzami!), A nie przez zmianę definicji kolumny podstawowej. Czasami preferowane jest przepisanie zapytania w celu sortowania kluczy zamiast całych wierszy.

Tam, gdzie maksymalny rozmiar wiersza może przekraczać limit w wierszu (nawet jeśli wiersze tak naprawdę nie mają), usunięcie wierszy może spowodować nieoczekiwany podział strony, jeśli występuje wyzwalacz. Aktualizacje mogą również prowadzić do fragmentacji za pomocą tego samego mechanizmu.

SQL Server wykonuje całkiem dobrą robotę w większości przypadków, gdy jest dostarczany z dobrymi, dokładnymi informacjami z metadanych. Naruszenie tej zasady „wygody” wydaje mi się niemądre. Rozsądnym podejściem jest wybranie maksymalnej długości, która jest rozsądna w zależności od rzeczywistych danych, które mają być przechowywane, i wszelkich przewidywalnych zmian.


-3

Jak wskazałeś, dopóki rozmiar wiersza nie przekracza 8060 (lub cokolwiek ustawiono maksimum), nie ma różnicy w wydajności przy użyciu VARCHAR (30) lub VARCHAR (255) lub większej. Porównanie CHAR do VARCHAR z powiązanego artykułu nie jest tak naprawdę istotne. Chociaż zgadzam się, że nie powinieneś określać więcej miejsca niż jesteś pewien, że potrzebujesz, w wielu przypadkach nie wiesz, ile faktycznie potrzebujesz. Bądź więc liberalny z przestrzenią VARCHAR - jestem prawie pewien, że zwiększenie wielkości pól wymaga przebudowy tabeli, podczas gdy zmniejszanie jest prostą instrukcją ALTER TABLE.


6
Zwiększenie rozmiaru kolumn o zmiennej długości jest prostą zmianą metadanych (z wyjątkiem zwiększenia do maxz non max). Jest to kierunek przeciwny, który ma wyższy narzut.
Martin Smith
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.