Ponieważ varchar
tak czy inaczej przydzielaj przestrzeń dynamicznie, moje pytanie dotyczy tego, czy używanie varchar(255)
jest bardziej wydajne, czy oszczędza więcej miejsca w porównaniu do używania varchar(5000)
. Jeśli tak, dlaczego?
sql-server
Tintin
źródło
źródło
Odpowiedzi:
Tak,
varchar(5000)
może być gorzej, niżvarchar(255)
gdyby wszystkie wartości pasowały do tego ostatniego. Powodem jest to, że SQL Server oszacuje rozmiar danych, a z kolei przydziały pamięci na podstawie zadeklarowanego (nie rzeczywistego ) rozmiaru kolumn w tabeli. Gdyvarchar(5000)
to zrobisz, przyjmie, że każda wartość ma 2500 znaków i na tej podstawie zarezerwuje pamięć.Oto demonstracja z mojej ostatniej prezentacji GroupBy na temat złych nawyków, która ułatwia udowodnienie sobie (wymaga SQL Server 2016 dla niektórych
sys.dm_exec_query_stats
kolumn wyjściowych, ale nadal powinna być możliwa do udowodnienia za pomocąSET STATISTICS TIME ON
lub innych narzędzi we wcześniejszych wersjach); pokazuje większą pamięć i dłuższe środowiska wykonawcze dla tego samego zapytania dla tych samych danych - jedyną różnicą jest deklarowany rozmiar kolumn:Tak , proszę odpowiednio dobrać kolumny .
Ponownie uruchomiłem testy z varchar (32), varchar (255), varchar (5000), varchar (8000) i varchar (max). Podobne wyniki ( kliknij, aby powiększyć ), choć różnice między 32 a 255 oraz między 5000 a 8000 były nieistotne:
Oto kolejny test ze
TOP (5000)
zmianą dla bardziej w pełni powtarzalnego testu, o który byłem nieustannie nękany ( kliknij, aby powiększyć ):Więc nawet przy 5000 wierszy zamiast 10.000 wierszy (i jest ponad 5000 wierszy w sys.all_columns co najmniej tak daleko jak SQL Server 2008 R2), obserwuje się względnie liniowy postęp - nawet przy tych samych danych, im większy jest zdefiniowany rozmiar kolumny, tym więcej pamięci i czasu jest potrzebnych do spełnienia dokładnie tego samego zapytania (nawet jeśli nie ma ono sensu
DISTINCT
).źródło
varchar(450)
ivarchar(255)
byłaby taka sama? (Lub coś poniżej 4000?)rowcount*(column_size/2)
.