Немає СУБД я НЕ знаю мають яку - або «оптимізацію» , які зроблять VARCHARз 2^nдовжиною краще , ніж один з maxдовжиною, яка не є ступенем 2.
Я думаю, що ранні версії SQL Server насправді розглядали VARCHARдовжину 255 інакше, ніж одну з більшою максимальною довжиною. Я не знаю, чи все ще так.
Практично для всіх СУБД фактична необхідна пам’ять визначається лише кількістю символів, які ви вводите в неї, а не maxдовжиною, яку ви визначаєте. Отже, з точки зору пам’яті (а також, швидше за все, і продуктивності), це не має ніякої різниці, оголошуєте ви стовпець як VARCHAR(100)або VARCHAR(500).
Ви повинні бачити maxдовжину VARCHARстовпця як певне обмеження (або ділове правило), а не технічну / фізичну річ.
Для PostgreSQL найкращою настройкою є використання textбез обмеження довжини та CHECK CONSTRAINTобмеження кількості символів на те, що потрібно вашому бізнесу.
Якщо ця вимога змінюється, зміна контрольного обмеження відбувається набагато швидше, ніж зміна таблиці (оскільки таблицю не потрібно переписувати)
Те саме можна застосувати і для Oracle та інших - в Oracle це було б VARCHAR(4000)замість цього text.
Я не знаю, чи є фізична різниця між сховищами VARCHAR(max)і, наприклад, VARCHAR(500)у SQL Server. Але, мабуть, є ефективність роботи при використанні varchar(max)в порівнянні з varchar(8000).
Дивіться це посилання (опублікував Ервін Брандштеттер як коментар)
Редагувати 22.09.2013
Щодо коментаря коханого:
У Postgres версії до 9.2 (яка не були доступні , коли я писав початковий відповідь) зміна в визначення стовпчика було переписати всю таблицю, дивіться , наприклад , тут . З 9.2 цього вже не так, і швидкий тест підтвердив, що збільшення розміру стовпця для таблиці на 1,2 мільйона рядків дійсно зайняло лише 0,5 секунди.
Для Oracle це також здається правдою, судячи з часу, необхідного для зміни varcharстовпця великої таблиці . Але я не міг знайти для цього жодної посилання.
Для MySQL в посібнику написано: " У більшості випадків ALTER TABLEробиться тимчасова копія оригінальної таблиці ". І мої власні тести підтверджують, що: запуск ALTER TABLEтаблиці на 1,2 мільйона рядків (те саме, що і в моєму тесті з Postgres) для збільшення розміру стовпця зайняв 1,5 хвилини. У MySQL, однак, ви не можете використовувати "вирішення", щоб використовувати обмеження для обмеження кількості символів у стовпці.
Для SQL Server я не зміг знайти чіткого твердження з цього приводу, але час виконання для збільшення розміру varcharстовпця (знову таблиця 1,2 мільйона рядків зверху) вказує на те, що перезапис не відбувається.
Редагувати 2017-01-24
Здається, я (принаймні частково) помилявся щодо SQL Server. Дивіться цю відповідь від Аарона Бертран, яка показує, що оголошена довжина а nvarcharабо varcharстовпців робить величезну різницю для продуктивності.