Есть ли смысл в заниженных столбцах VARCHAR?

18

Похоже, что гуглить там - смешанные отчеты, влияет ли размер VARCHAR2столбца в Oracle на производительность или нет.

Я хотел бы VARCHARнемного подправить вопрос о размере и надеюсь получить некоторое представление об этом:

Для заданных (многострочных) полей с произвольным текстом ( не таких коротких, как имена), которые вы хотите сохранить в базе данных (Oracle), есть ли смысл (относительно производительности или иным образом) не увеличивать VARCHARемкость ( VARCHAR2(4000)в Oracle), а выбирать меньшее значение, например 1024 или 512, потому что в любом случае этого будет достаточно в 98% случаев.

Мартин
источник
Связанный задать вопрос Тому
Вадим

Ответы:

12

Это влияет на использование памяти, особенно когда клиентская программа должна выделить достаточно памяти для получения набора данных.

Имейте в виду, что многие приложения (особенно веб-приложения) используют UTF-8, который является многобайтовым набором символов. Таким образом, вы должны рассматривать символы, а не байты.

Если бы я ожидал более тысячи символов, я бы активно рассматривал CLOB. Я бы подумал о том, будет ли он хранить обычный текст или какую-либо форму разметки (wiki / html?), Используемую с языками, отличными от евро. Например, Вопросы и Ответы здесь будут CLOB, но комментарии могут поместиться в VARCHAR.

Если вы максимизируете VARCHAR, то через шесть месяцев кто-то захочет снова увеличить его, и вы будете пинать себя за то, что не используете CLOB.

Gary
источник
2
UTF-8 обычно использует один байт на один символ для западных языков. Он является многобайтовым в том смысле, что позволяет многобайтовым «escape-» последовательностям представлять незападные символы.
Эрик Дж.
9

Как правило, нет никаких проблем с производительностью, хотя есть побочные проблемы, которые могут иметь значение для вас. Ограничение для a varcharследует рассматривать как ограничение, как и любое другое - оно должно обеспечивать соблюдение бизнес-правила.

IMO вопрос, который вы должны задать: «Хочу ли я, чтобы данные в свободном тексте, хранящиеся в этом поле, были длиннее n байтов / символов» - это единственный определяющий фактор при выборе между varchar(512)и varchar(4000).

Обратите внимание, что я предполагаю, что вы говорите о varcharтипе SQL - ситуация иная, pl/sqlи выбор длины может иметь решающее значение для распределения памяти.

Джек Дуглас
источник
Благодарю. Что касается моего (очень ограниченного) опыта, то любое "бизнес-правило", устанавливающее ограничение между "500 - 3999", является просто произвольным, то есть кому-то просто понравилось число. ИМХО, если я собираюсь сделать произвольный текст и у него нет последствий для реализации (в контексте этого вопроса), либо он исчерпан (4000), либо не является свободным текстом. --- Смысл, который я пытаюсь сделать в этом комментарии: я думаю, что никогда не будет бизнес-правила, помогающего выбирать между прочим. 512 и 4000 (если это не «столько символов, сколько возможно»)
Мартин
Если это действительно «столько символов, сколько возможно», то, как говорит @gary, вы должны подумать clob, не так ли?
Джек Дуглас
4

Если меньшее значение будет работать для 98% случаев, но для 100% случаев потребуется Varchar2 (4000), то у вас нет другого выбора, кроме как использовать большее значение . Создание отдельной таблицы для 2% значений, а затем координация операций вставки / выбора и т. Д. Привели бы к усложнению, которое уничтожило бы любые преимущества памяти или производительности из-за отсутствия расширения поля.

Ли Риффель
источник