为什么不使用varchar(max)?

时间:2011-08-21 21:50:47

标签: sql tsql sql-server-2008 varcharmax

在数据库设计方面,我有点老了,所以我完全在列中使用正确的数据大小。但是,在为朋友查看数据库时,我发现他经常使用varchar(max)。现在,我的想法是把它扔回给他并告诉他改变它。但后来我想到了它并且没有提出他不使用它的充分理由(如果你想知道的话,他会使用案例类型工具生成数据库)。

我一直在研究varchar(max)用法的主题,我无法提出任何不使用它的理由。

他不使用索引列,db上的应用程序对输入有限制,因此不允许在字段中输入大量条目。

任何帮助都会受到赞赏,以帮助我让他看到光明:)。

8 个答案:

答案 0 :(得分:33)

我对此的回答,不是关于Max的使用,而是关于VARCHAR(max)vs TEXT的原因。

在我的书中;首先,除非你绝对肯定你永远不会编码除英文文本以外的任何东西,而且人们不会引用外国地名,那么你应该使用NVARCHAR或NTEXT。

其次,这是字段允许你做的事情。

与VARCHAR相比,TEXT很难更新,但您可以获得全文索引和许多聪明的东西。

另一方面,如果小区的大小<1,则VARCHAR(MAX)具有一些模糊性。 8000个字符,它将被视为行数据。如果它更大,它将被视为用于存储目的的LOB。 因为如果不查询RBAR就无法知道这一点,这可能会为您需要确定数据以及需要花费多少读取的地方提供优化策略。

否则,如果您的使用相对平凡并且您不希望数据大小出现问题(IE您正在使用.Net,因此不必担心字符串/字符的大小*对象)然后使用VARCHAR(max)就可以了。

答案 1 :(得分:13)

有一篇关于为何不使用varchar max here

的博客文章

修改

基本区别在于存储数据的位置。 SQL数据行的最大大小为8000字节(或者是8K)。然后,2GB varchar(max)无法存储在数据行中。 SQL Server将其“存储在行外”。

因此,由于数据不在磁盘上的相同位置,您可能会受到性能影响,请参阅:http://msdn.microsoft.com/en-us/library/ms189087.aspx

答案 2 :(得分:2)

如果您在OLTP环境中工作,那么您就可以了解性能。从开销和调优问题到索引限制和查询瓶颈。使用varcahr(max)或任何其他LOB类型很可能违反大多数设计最佳实践,因此除非有特定的业务需求无法通过使用其他类型的键入机制来处理,并且只有varchar(max)适合请问为什么要让您的系统和应用程序受到其中一种LOB数据类型固有的开销和性能问题?

另一方面,如果您正在OLAP环境或Star Schema DW环境中工作,其中带有描述符字段的Dimension表自然需要详细,那么varchar(max),只要您不将其添加到一个索引,可能有用。我仍然建议使用char(x)varchar(x)因为最好只使用这些资源,所以你必须完成工作。

答案 3 :(得分:1)

除非您需要大量数据,否则不应使用它们,这就是为什么(直接来自联机丛书):

  

大对象(LOB)数据类型ntext,text,   varchar(max),nvarchar(max),varbinary(max),xml或image不能   指定为索引的键列。

如果您想削弱性能,请将nvarchar用于所有内容。

答案 4 :(得分:1)

Redgate撰写了一篇很棒的文章。
https://www.red-gate.com/simple-talk/sql/database-administration/whats-the-point-of-using-varcharn-anymore/

结论

  • 在适当情况下,出于以下原因,应在VARCHAR(MAX)上使用VARCHAR(n) 好的设计(如果没有性能优势),并且因为VARCHAR(MAX) 数据不压缩
  • 存储大字符串比存储小字符串需要更长的时间。
  • 将行内VARCHAR(MAX)值从8,000以下更新到8,000以上 会比较慢,但是单笔交易的区别 可能无法衡量。
  • 将行内VARCHAR(MAX)值从8,000以上更新到8,000以下 比将表设置为按行存储数据要快。
  • 对VARCHAR(MAX)使用行外选项将导致写入速度变慢 直到弦很长。

答案 5 :(得分:0)

我不知道sql server如何从性能,内存和存储角度处理大型(声明的)varchar字段..但假设它与较小的声明varchar字段一样有效,那么仍然存在完整性约束的好处。 / p>

位于数据库上的应用程序假设对输入有限制,但如果应用程序在这方面存在错误,数据库可以正确报告错误。

答案 6 :(得分:0)

差异在下一个:
VARCHAR(X)可以编入索引并存储在MDF/NDF数据文件中 VARCHAR(MAX)无法编入索引,因为它可以达到较高的音量,然后将存储为单独的文件而不是MDF/NDF数据文件。

答案 7 :(得分:0)

认为应用程序只会将短字符串传递给数据库,这有点过时了,这样就可以了

在现代,您预计数据库将主要由当前应用程序访问,但可能有未来版本的应用程序,(该版本的开发人员将知道保持字符串低于一定长度?)

必须预计将使用Web服务,ETL进程,LYNC到SQL以及任何其他已有的和/或尚未存在的技术来访问您的数据库。< / p>

一般来说,我尽量不要超过varchar(4000),因为它毕竟是四千个字符。如果我超过了那个,那么我会寻找其他数据类型来存储我想要存储的任何内容。 Brent Ozar在此上写了一些非常great stuff

所有这一切,在您处理项目时评估当前设计的当前要求的方法非常重要。了解各个部分的工作原理,了解各种方法的权衡并解决手头的问题。行使一些伟大的公理会导致盲目坚持,这可能会使你变成lemming