Почему бы не использовать varchar(max)?

Я немного староват, когда дело доходит до проектирования баз данных, поэтому я полностью использую правильные размеры данных в столбцах. Однако, просматривая базу данных для друга, я заметил, что он использовал varchar(max) много. Теперь, моей непосредственной мыслью было вернуть его ему и сказать, чтобы он изменил это. Но потом я подумал об этом и не смог придумать для него вескую причину не использовать его (он использовал инструмент типа случая для генерации БД, если вам интересно).

Я исследовал тему varchar(max) использование, и я не могу придумать для него вескую причину не использовать его.

Он не использует столбцы для индексов, приложение, которое находится на БД, имеет ограничения на ввод, поэтому не допускает массовых записей в полях.

Буду признателен за любую помощь, чтобы он заставил его увидеть свет:).

9 ответов

Решение

Мой ответ на этот вопрос не об использовании Max, а о причине VARCHAR(max) против TEXT.

В моей книге; Прежде всего, если вы не можете быть абсолютно уверены, что никогда не будете кодировать что-либо, кроме английского текста, и люди не будут ссылаться на названия иностранных локаций, тогда вам следует использовать NVARCHAR или NTEXT.

Во-вторых, это то, что поля позволяют вам делать.

TEXT сложно обновлять по сравнению с VARCHAR, но вы получаете преимущество полнотекстового индексирования и множества умных вещей.

С другой стороны, VARCHAR(MAX) имеет некоторую неоднозначность, если размер ячейки< 8000 символов, он будет обрабатываться как данные строк. Если оно больше, оно будет рассматриваться как большой объект для хранения. Поскольку вы не можете знать это, не обращаясь к RBAR, у этого могут быть стратегии оптимизации для мест, где вы должны быть уверены в своих данных и во сколько их стоит чтение.

В противном случае, если вы используете относительно обыденно, и вы не ожидаете проблем с размером данных (IE вы используете.Net и, следовательно, не должны беспокоиться о размере ваших объектов string/char*) тогда использование VARCHAR (макс.) нормально.

Здесь есть запись в блоге о том, почему бы не использовать varchar max здесь

редактировать

Основное различие заключается в том, где хранятся данные. Максимальный размер строки данных SQL составляет 8000 байт (или 8K). Тогда 2GB varchar(max) не может быть сохранен в строке данных. SQL Server хранит его "Out of row".

Поэтому вы можете получить снижение производительности, так как данные не будут находиться в одном и том же месте на диске, см.: http://msdn.microsoft.com/en-us/library/ms189087.aspx

Если вы работаете в среде OLTP, вы все о производительности. От накладных расходов и проблем настройки до ограничений индексации и узких мест запросов. Использование varcahr(max) или любого другого типа LOB, скорее всего, будет противоречить большинству передовых методов проектирования, поэтому, если нет особой бизнес-потребности, которая не может быть решена с помощью какого-либо другого механизма ввода, и только varchar(max) будет соответствовать В таком случае, зачем подвергать вашу систему и приложения таким проблемам, связанным с накладными расходами и производительностью, которые свойственны одному из типов данных больших объектов?

Если, с другой стороны, вы работаете в среде OLAP или в среде DW Star Schema с таблицами измерений с полями дескрипторов, которые, естественно, должны быть многословными, тогда varchar(max), если вы не добавляете это в индекс, может быть полезным Тем не менее, я бы порекомендовал даже тогда использовать char(x) varchar(x), так как всегда рекомендуется использовать только те ресурсы, которые вам абсолютно необходимы для выполнения работы.

Redgate написал отличную статью об этом.
https://www.red-gate.com/simple-talk/sql/database-administration/whats-the-point-of-using-varcharn-anymore/

Выводы

  • Где это уместно, используйте VARCHAR(n) вместо VARCHAR(MAX) по причинам хорошего дизайна, если не для повышения производительности, а также потому, что данные VARCHAR(MAX) не сжимаются
  • Хранение больших строк занимает больше времени, чем хранение маленьких строк.
  • Обновление значения VARCHAR(MAX) в строке с уровня ниже 8000 до более 8000 будет относительно медленным, но разница для одной транзакции, скорее всего, не будет измеримой.
  • Обновление значения VARCHAR(MAX) в ряду от более 8000 до менее 8000 будет быстрее, чем если бы таблица была настроена для хранения данных вне строки.
  • Использование параметра вне строки для VARCHAR(MAX) приведет к более медленной записи, пока строки не станут очень длинными.

Почему бы и нет? Есть причины не использовать varchar(max):

  1. Как и старый добрый BLOB, SQL Server не может индексировать столбец varchar(max).
  2. Это просто расточительно и лениво выделять лишнее, особенно varchar(max), поскольку оно выделяет ПО КРАЙНЕЙ МЕРЕ 8 байтов на строку. Я видел, как разработчики присваивали «max» однобайтовым бинарным (True/False) переменным только для того, чтобы позже обнаружить, что система медлительна, как патока, при различении данных с использованием этих значений.
  3. Вы не можете сделать вывод, какой тип данных там сохраняется. Очевидным исключением использования является сохранение больших фрагментов текста размером до 8 КБ.

Они НЕ должны использоваться, если вы не ожидаете больших объемов данных, и вот причина (прямо из Books Online):

Столбцы с типами данных больших объектов (LOB) ntext, text, varchar(max), nvarchar(max), varbinary(max), xml или image не могут быть указаны в качестве ключевых столбцов для индекса.

Если вы хотите снизить производительность, используйте nvarchar для всего.

Разница в следующем:
VARCHAR(X) может быть проиндексирован и сохранен в MDF/NDF файл данных.
VARCHAR(MAX) не может быть проиндексирован, потому что может достигнуть большого объема, а затем будет сохранен как отдельный файл, а не в MDF/NDF файл данных.

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

В наше время вы ДОЛЖНЫ ожидать, что к базе данных будет обращаться, главным образом, текущее приложение, но может существовать будущая версия приложения (будет ли разработчик этой версии знать, что строки будут иметь определенную длину?)

Вы ДОЛЖНЫ предвидеть, что для доступа к вашей базе данных будут использоваться веб-службы, процессы ETL, LYNC to SQL и любое другое количество уже существующих и / или еще не существующих технологий.

Вообще говоря, я стараюсь не переходить на varchar(4000), потому что в конце концов это четыре тысячи символов. Если я превышаю это значение, тогда я обращаюсь к другим типам данных, чтобы сохранить то, что я пытаюсь сохранить. Брент Озар написал несколько замечательных вещей на эту тему.

С учетом всего вышесказанного важно оценить подход текущего проекта к вашим текущим требованиям, когда вы работаете над проектом. Иметь представление о том, как работают различные части, понять компромиссы различных подходов и решить проблему под рукой. Выполнение некоторой великой аксиомы может привести к слепой приверженности, которая может превратить вас в лемминга.

Я не знаю, как sql-сервер обрабатывает большие (объявленные) поля varchar с точки зрения производительности, памяти и хранилища... но при условии, что он делает это так же эффективно, как и меньшие объявленные поля varchar, все еще есть преимущество ограничений целостности.

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

Другие вопросы по тегам