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