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


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

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

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

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

8 63

8 ответов:

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

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

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

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

с другой стороны, VARCHAR(MAX) имеет некоторую двусмысленность, если размер ячейки

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

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

Edit

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

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

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

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

Они не должны использоваться, если вы не ожидаете больших объемов данных, и вот почему (непосредственно из книг в Интернете):

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

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

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

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

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

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

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

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

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

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

Редгейт написал большую статью о this.
https://www.red-gate.com/simple-talk/sql/database-administration/whats-the-point-of-using-varcharn-anymore/

выводы

  • при необходимости используйте VARCHAR (n) над VARCHAR (MAX) по причинам хороший дизайн, если не преимущества производительности, а потому что VARCHAR(Макс) данные не сжимаются
  • хранение больших строк занимает больше времени, чем хранения мелких веревка.
  • обновление значения в строке VARCHAR (MAX) от 8000 до более чем 8000 будет относительно медленно, но разница для одной транзакции скорее всего, не будет измеряться.
  • обновление значения в строке VARCHAR (MAX) от более 8000 до менее 8000 будет быстрее, чем если таблица настроена для хранения данных вне строки.
  • использование параметра out-of-row для VARCHAR (MAX) приведет к замедлению записи пока струны не станут очень длинными.