Ни одна из СУБД, о которой я знаю, не имеет какой-либо «оптимизации», которая заставляла 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).
Смотрите эту ссылку (опубликовано Erwin Brandstetter в качестве комментария)
Изменить 2013-09-22
Что касается комментария Bigown:
В 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имеет огромное значение для производительности.