Żaden DBMS, o którym wiem, nie ma żadnej „optymalizacji”, która sprawi, że a VARCHAR
przy 2^n
długości będzie działać lepiej niż ta o max
długości, która nie jest potęgą 2.
Myślę, że wczesne wersje programu SQL Server traktowały VARCHAR
długość 255 inaczej niż ta o większej maksymalnej długości. Nie wiem, czy nadal tak jest.
W przypadku prawie wszystkich DBMS rzeczywista wymagana pamięć zależy tylko od liczby wprowadzonych znaków, a nie od max
zdefiniowanej długości. Zatem z punktu widzenia przechowywania (i prawdopodobnie również wydajności) nie ma znaczenia, czy deklarujesz kolumnę jako VARCHAR(100)
czy VARCHAR(500)
.
max
Długość VARCHAR
kolumny powinna być postrzegana raczej jako rodzaj ograniczenia (lub reguły biznesowej) niż rzecz techniczna / fizyczna.
W przypadku PostgreSQL najlepszą konfiguracją jest użycie text
bez ograniczenia długości i CHECK CONSTRAINT
znaku, który ogranicza liczbę znaków do wszystkiego, czego wymaga Twoja firma.
Jeśli to wymaganie ulegnie zmianie, zmiana ograniczenia sprawdzania jest znacznie szybsza niż zmiana tabeli (ponieważ tabela nie musi być ponownie zapisywana)
To samo można zastosować do Oracle i innych - w Oracle byłoby to jednak VARCHAR(4000)
zamiast text
.
Nie wiem, czy istnieje fizyczna różnica w przechowywaniu między VARCHAR(max)
np. VARCHAR(500)
W SQL Server. Ale najwyraźniej ma to wpływ na wydajność podczas korzystania varchar(max)
w porównaniu do varchar(8000)
.
Zobacz ten link (opublikowany przez Erwina Brandstettera jako komentarz)
Edytuj 22.09.2013
Odnośnie komentarza bigown:
W wersji PostgreSQL 9.2 przed (który nie był dostępny kiedy pisałem wstępną odpowiedź) zmiana definicji kolumny zrobił przepisać całą tabelę, patrz na przykład tutaj . Od wersji 9.2 już tak nie jest, a szybki test potwierdził, że zwiększenie rozmiaru kolumny dla tabeli z 1,2 milionami wierszy rzeczywiście zajęło tylko 0,5 sekundy.
W przypadku Oracle wydaje się to również prawdą, sądząc po czasie potrzebnym na zmianę varchar
kolumny dużego stołu . Ale nie mogłem znaleźć na to odniesienia.
W przypadku MySQL instrukcja mówi: „ W większości przypadków ALTER TABLE
tworzy tymczasową kopię oryginalnej tabeli ”. I moje własne testy to potwierdzają: uruchomienie ALTER TABLE
tabeli z 1,2 milionami wierszy (tak samo jak w moim teście z Postgres), aby zwiększyć rozmiar kolumny, zajęło 1,5 minuty. W MySQL nie można jednak użyć „obejścia”, aby użyć ograniczenia sprawdzania w celu ograniczenia liczby znaków w kolumnie.
W przypadku programu SQL Server nie mogłem znaleźć jednoznacznej instrukcji na ten temat, ale czas wykonania w celu zwiększenia rozmiaru varchar
kolumny (ponownie powyższej tabeli 1,2 miliona wierszy) wskazuje, że nie ma miejsca żadne przepisywanie.
Edytuj 24.01.2017
Wygląda na to, że myliłem się (przynajmniej częściowo) w kwestii programu SQL Server. Zobacz tę odpowiedź Aarona Bertranda, która pokazuje, że zadeklarowana długość a nvarchar
lub varchar
kolumn ma ogromne znaczenie dla wydajności.