Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Najlepsze praktyki dotyczące długości kolumny varchar SQL

Żaden DBMS, o którym wiem, nie ma żadnej „optymalizacji”, która utworzy VARCHAR z 2^n długość działa lepiej niż jeden z max długość, która nie jest potęgą 2.

Myślę, że wczesne wersje SQL Server faktycznie traktowały VARCHAR o długości 255 inaczej niż o większej długości maksymalnej. Nie wiem, czy nadal tak jest.

Dla prawie wszystkich DBMS, rzeczywista wymagana pamięć jest określana tylko przez liczbę znaków, które w niej umieścisz, a nie przez max długość, którą definiujesz. Tak więc z punktu widzenia przechowywania (i prawdopodobnie również wydajności), nie ma znaczenia, czy zadeklarujesz kolumnę jako VARCHAR(100) lub VARCHAR(500) .

Powinieneś zobaczyć max długość podana dla VARCHAR kolumna jako rodzaj ograniczenia (lub reguły biznesowej), a nie rzecz techniczna/fizyczna.

W przypadku PostgreSQL najlepszą konfiguracją jest użycie text bez ograniczenia długości i CHECK CONSTRAINT to ogranicza liczbę znaków do tego, czego wymaga Twoja firma.

Jeśli to wymaganie ulegnie zmianie, zmiana ograniczenia sprawdzającego jest znacznie szybsza niż zmiana tabeli (ponieważ tabeli nie trzeba przepisywać)

To samo można zastosować do Oracle i innych - w Oracle będzie to VARCHAR(4000) zamiast text chociaż.

Nie wiem, czy istnieje fizyczna różnica w pamięci masowej między VARCHAR(max) i m.in. VARCHAR(500) w SQL Server. Ale najwyraźniej istnieje wpływ na wydajność podczas korzystania z varchar(max) w porównaniu do varchar(8000) .

Zobacz ten link (opublikowane przez Erwina Brandstettera jako komentarz)

Edytuj 22.09.2013

Odnośnie komentarza bigown:

W wersjach Postgresa przed 9.2 (które nie były dostępne, gdy pisałem początkową odpowiedź) zmiana definicji kolumny zrobiła przepisz na nowo całą tabelę, zobacz m.in. tutaj . Od wersji 9.2 tak już nie jest, a szybki test potwierdził, że zwiększenie rozmiaru kolumny dla tabeli z 1,2 miliona wierszy rzeczywiście zajęło tylko 0,5 sekundy.

W przypadku Oracle wydaje się to być prawdą, sądząc po czasie potrzebnym do zmiany varchar dużej tabeli kolumna. Ale nie mogłem znaleźć żadnego odniesienia do tego.

W przypadku MySQL instrukcja mówi "W większości przypadków ALTER TABLE tworzy tymczasową kopię oryginalnej tabeli ". A moje własne testy potwierdzają to:uruchomienie ALTER TABLE na stole z 1,2 miliona wierszy (tyle samo co w moim teście z Postgresem) zwiększenie rozmiaru kolumny zajęło 1,5 minuty. Jednak w MySQL możesz nie użyj "obejścia", aby użyć ograniczenia sprawdzającego w celu ograniczenia liczby znaków w kolumnie.

W przypadku SQL Server nie mogłem znaleźć jasnego oświadczenia na ten temat, ale czas wykonania, aby zwiększyć rozmiar varchar kolumna (ponownie tabela 1,2 miliona wierszy powyżej) wskazuje, że nie ma miejsce przepisywanie.

Edytuj 24.01.2017

Wygląda na to, że (przynajmniej częściowo) się myliłem co do SQL Server. Zobacz tę odpowiedź Aarona Bertranda który pokazuje, że zadeklarowana długość nvarchar lub varchar kolumny mają ogromny wpływ na wydajność.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Co to jest CHAR_LENGTH() w MySQL?

  2. Jak skonfigurować automatyczne przełączanie awaryjne dla bazy danych Moodle MySQL?

  3. Jak wstawić, jeśli wiersz nie istnieje (UPSERT) w MySQL?

  4. Jak zdobyć tylko cyfry z ciągu w mysql?

  5. Jak uzyskać ostatni rekord w każdej grupie w MySQL?