Немає СУБД я НЕ знаю мають яку - або «оптимізацію» , які зроблять 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
стовпців робить величезну різницю для продуктивності.