Ни одна из СУБД, о которой я знаю, не имеет какой-либо «оптимизации», которая заставляла 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
имеет огромное значение для производительности.
varchar(max)
это больше похоже на OracleCLOB
VARCHAR(255)
иVARCHAR(2)
занять ровно столько же места на диске! Таким образом, единственная причина ограничить это, если у вас есть конкретная потребность, чтобы он был меньше. В противном случае сделайте их всех 255.В частности, при выполнении сортировки столбцы большего размера занимают больше места, поэтому, если это ухудшает производительность, вам нужно беспокоиться об этом и уменьшать их. Но если вы выберете только одну строку из этой таблицы, вы можете просто сделать их все 255, и это не будет иметь значения.
Смотрите: Каковы оптимальные размеры varchar для MySQL?
источник
VARCHAR(MAX)
? Пространство - не единственное соображение при моделировании базы данных. Домен, который вы моделируете, должен управлять типами данных и размерами.VARCHAR(MAX)
- это не то же самое, чтоvarchar(255)
илиvarchar(65535)
- varchar max - это типtext
данных. И к вашему мнению - если бы он знал, что такое «область, которую он моделировал», он бы не задавал этот вопрос. Ясно, что он не знает, насколько большими будут его данные, и я заверяю его, что создание полного размера ничего не вредит.(a,b,c,d)
индекс, когда все четыре столбцаVARCHAR(255)
.Всякий раз, когда я настраиваю новую таблицу SQL, я чувствую то же самое, когда 2 ^ n более "четный" ... но, суммируя ответы здесь, нет существенного влияния на пространство хранения, если просто определить varchar (2 ^ n) или даже varchar (Макс).
Тем не менее, вы все равно должны предвидеть потенциальные последствия для хранения и производительности при установке высокого предела varchar (). Например, допустим, вы создали столбец varchar (MAX) для хранения описаний продуктов с полнотекстовой индексацией. Если длина 99% описаний составляет всего 500 символов, а затем вдруг появляется кто-то, кто заменяет упомянутые описания статьями в Википедии, вы можете заметить непредвиденные значительные потери памяти и производительности.
Еще одна вещь от Билла Карвина :
В основном, просто придумайте разумные бизнес-ограничения и ошибки немного большего размера. Как отметил @onedaywhen, фамилии в Великобритании обычно составляют от 1 до 35 символов. Если вы решите сделать его varchar (64), вы не причините вреда ... если только вы не сохраните фамилию этого парня длиной до 666 символов. В этом случае, возможно, varchar (1028) имеет больше смысла.
И в случае, если это полезно, вот как может выглядеть varchar 2 ^ 5 - 2 ^ 10, если заполнено:
источник
Лучшее значение - это то, которое подходит для данных, определенных в базовом домене.
Для некоторых доменов
VARCHAR(10)
это правильно дляName
атрибута, для других доменовVARCHAR(255)
может быть лучшим выбором.источник
Добавляя к ответу a_horse_with_no_name, вы можете найти следующее интересное ...
Не забывайте длину байта (ов) и обнуляемый байт так:
name varchar(100) not null
будет 1 байт (длина) + до 100 символов (латиница 1)name varchar(500) not null
будет 2 байта (длина) + до 500 символов (латиница 1)name varchar(65533) not null
будет 2 байта (длина) + до 65533 символов (латиница 1)name varchar(65532)
будет 2 байта (длина) + до 65532 символов (латиница 1) + 1 нулевой байтНадеюсь это поможет :)
источник
Всегда уточняйте у своего специалиста. Если это вы, ищите отраслевой стандарт. Например, если рассматриваемый домен является фамилией (фамилией) физического лица, то для бизнеса в Великобритании я бы пошел в каталог стандартов данных Govtalk в Великобритании для получения информации о человеке и обнаружил, что фамилия будет содержать от 1 до 35 символов. ,
источник
Я не проверял это в последнее время, но в прошлом я знал, что в случае с драйвером JDBC во время выполнения запроса резервируется кусок памяти для удержания возвращаемого набора результатов. Размер порции памяти зависит от определений столбца и размера выборки. Таким образом, длина столбцов varchar2 влияет на объем зарезервированной памяти. Это вызвало у меня серьезные проблемы с производительностью много лет назад, так как мы всегда использовали varchar2 (4000) (максимум в то время), и сборка мусора была намного менее эффективной, чем сегодня.
источник
В некотором смысле вы правы, хотя все, что меньше 2 ^ 8 символов, все равно будет регистрироваться как байт данных.
Если вы учитываете базового персонажа, который оставляет что-либо с VARCHAR <255, он занимает столько же места.
255 является хорошим базовым определением, если вы не хотите особенно ограничивать чрезмерный ввод.
источник