Нет СУБД, о которой я знаю, имеет какую-либо "оптимизацию", которая позволит 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 миллиона строк сверху) указывает на то, что no rewrite занимает место.
Редактировать 2017-01-24
Кажется, я (хотя бы частично) ошибался насчет SQL Server. Посмотрите этот ответ от Аарона Бертрана , который показывает, что заявленная длина столбцов nvarchar
или varchar
имеет огромное значение для производительности.