Czy rozmiar varchar ma znaczenie w tabelach tymczasowych?

16

W pracy mojej żony toczy się debata na temat używania varchar(255)wszystkich varcharpól w tabelach tymczasowych w procedurach przechowywanych. Zasadniczo jeden obóz chce użyć 255, ponieważ zawsze będzie działał, nawet jeśli zmieni się definicja, a drugi obóz chce pozostać przy wielkości w tabelach źródłowych w celu potencjalnej poprawy wydajności.

Czy obóz wydajności jest odpowiedni? Czy są inne implikacje? Używają programu SQL Server.

Brian Nickel
źródło
Twierdziłbym, że może nie potrzebujesz tymczasowych stołów. Do czego są używane? Jeśli są potrzebne, do czego służą te konkretne kolumny? Czy są używane w sprzężeniach lub porównaniach jakiegokolwiek rodzaju? Czy któraś z podstawowych kolumn nvarchar, a nie varchar?
Aaron Bertrand
@AaronBertrand Tabele tymczasowe służą modułowości. Dane są przekształcane i zapełniane wiele razy na podstawie reguł biznesowych, które mogą ulec zmianie. Myślę, że MAX()w miksie jest też kilka .
Brian Nickel

Odpowiedzi:

6

W zależności od sposobu korzystania z tabel tymczasowych może wystąpić problem z obcinaniem danych.

Ten przykład jest nieco wymyślony, ale ilustruje mój punkt widzenia. Przykład:

  1. Twoja kolumna tabeli użytkowników to varchar (50).
  2. Twoja kolumna tabeli tymczasowej to varchar (255).
  3. Masz rekord zawierający 45 znaków w tej kolumnie w tabeli użytkowników.
  4. W swojej procedurze konkatenujesz „- dla wygranej” do końca tej kolumny, przed scaleniem tej tabeli tymczasowej z tabelą użytkownika.

Tabela temp chętnie zaakceptowałaby nową wartość varchar o długości 59. Jednak tabela użytkowników nie mogła. W zależności od tego, jak sobie z tym poradzisz w procedurze, może to spowodować obcięcie lub błąd.

O ile nie udokumentujesz i nie uwzględnisz tych problemów, procedura może zostać wykonana w nieoczekiwany sposób.

Osobiście nie sądzę, aby odpowiedź na to pytanie była poprawna w 100% przypadków. To naprawdę zależy od tego, jak korzystasz z tych tabel tymczasowych.

Mam nadzieję że to pomoże

Matt M.
źródło
0

użycie varchar(255)dla wszystkich varcharpól w tabelach tymczasowych w procedurach przechowywanych.

Skłoniłbym się do użycia rzeczywistej długości pola.

Niedawno przeczytałem, że MySQL (zakładam, że SQL Server jest podobny) tabele temp przydzielają wystarczającą ilość pamięci do przechowywania maksymalnej możliwej długości dla każdej varcharkolumny ... Systematyczne podejście do alokacji 200% -500% wymaganej pamięci dla varcharpól we wszystkich procedury składowane wydają się niepotrzebnym wykorzystaniem zasobów systemowych. Jeśli kiedykolwiek używasz znacznej ilości pamięci do tworzenia tych tabel tymczasowych, możesz niepotrzebnie żądać pamięci, która była używana do buforowania, tworząc więcej pracy dla serwera w pewnym momencie w przyszłości, nawet po zakończeniu procedur przechowywania.

Edycja: Zobacz odpowiedź Billa Karwina: /programming/1962310/importance-of-varchar-length-in-mysql-table

Matt
źródło
2
Zakładając, że SQL Server jest podobny? Nie chciałbym ...
AK,
Przepraszam, zdaję sobie sprawę, że moja odpowiedź jest niepełna. Mam na myśli to, że popełniłbym błąd ze względu na ostrożność (tj. Nie dokonywanie zmian, które mogłyby negatywnie wpłynąć na wydajność), chyba że założenie to okaże się błędne.
Matt