Sql 为什么不使用varchar(max)?

Sql 为什么不使用varchar(max)?,sql,tsql,sql-server-2008,varcharmax,Sql,Tsql,Sql Server 2008,Varcharmax,在数据库设计方面,我有点老派,所以我完全支持在列中使用正确的数据大小。然而,当我为朋友查看数据库时,我注意到他经常使用varchar(max)。现在,我立刻想到的是把它扔给他,告诉他改变它。但是后来我想了想,找不出一个好的理由让他不使用它(如果你想知道的话,他使用了一个案例类型工具来生成db) 我一直在研究varchar(max)用法的主题,我真的找不出任何好的理由让他不使用它 他不使用列作为索引,数据库上的应用程序对输入有限制,因此不允许字段中出现大量条目 如果能帮我让他明白过来,我们将不胜感

在数据库设计方面,我有点老派,所以我完全支持在列中使用正确的数据大小。然而,当我为朋友查看数据库时,我注意到他经常使用
varchar(max)
。现在,我立刻想到的是把它扔给他,告诉他改变它。但是后来我想了想,找不出一个好的理由让他不使用它(如果你想知道的话,他使用了一个案例类型工具来生成db)

我一直在研究
varchar(max)
用法的主题,我真的找不出任何好的理由让他不使用它

他不使用列作为索引,数据库上的应用程序对输入有限制,因此不允许字段中出现大量条目


如果能帮我让他明白过来,我们将不胜感激:)。

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


数据库上的应用程序被认为对输入有限制,但是如果应用程序在这方面有缺陷,数据库可以正确地报告错误。

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

在我的书中;首先,除非你能绝对肯定你永远不会编码任何东西,除了英文文本和人们不会提到外国地点的名称,那么你应该使用NVARCHAR或NTEXT

其次,它是字段允许您执行的操作

与VARCHAR相比,文本很难更新,但是您可以利用全文索引和许多聪明的东西

另一方面,VARCHAR(MAX)有一些模糊性,如果单元格的大小小于8000个字符,它将被视为行数据。如果较大,则出于存储目的将其视为LOB。 因为在不查询RBAR的情况下无法知道这一点,所以对于需要确定数据和数据读取次数的地方,这可能有优化策略


否则,如果您的使用相对平淡无奇,并且您不希望在数据大小方面出现问题(即您使用的是.Net,因此不必担心字符串/char*对象的大小),那么使用VARCHAR(max)就可以了。

有一篇关于为什么不使用VARCHAR max的博客文章

编辑

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


因此,由于数据不在磁盘上的同一位置,您可能会受到性能影响,请参阅:

除非您需要大量数据,否则不应使用这些数据,原因如下(直接来自联机丛书):

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

如果您想削弱性能,请使用nvarchar进行所有操作。

差异在下一步:
VARCHAR(X)
可以编制索引

VARCHAR(MAX)
无法编制索引

如果您在OLTP环境中工作,那么您需要关注性能。从开销和调优问题到索引限制和查询瓶颈。使用varcahr(max)或任何其他LOB类型很可能会违反大多数设计最佳实践,因此,除非存在无法通过使用其他类型机制和仅使用varchar(max)来处理的特定业务需求那么,为什么要让您的系统和应用程序承受某个LOB数据类型中固有的开销和性能问题呢


另一方面,如果您在OLAP环境或星型模式DW环境中工作,并且维度表中的描述符字段自然需要详细,那么varchar(max)可能很有用,只要您不将其添加到索引中。尽管如此,我还是建议使用char(x)varchar(x),因为最好只使用完成任务所必须的那些资源。

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

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

您必须预计web服务、ETL流程、LYNC to SQL以及任何其他数量的现有和/或尚未存在的技术将用于访问您的数据库

一般来说,我尽量不去看varchar(4000),因为它毕竟是4000个字符。如果我超过了这个值,那么我会寻找其他数据类型来存储我试图存储的数据。在这方面写了一些漂亮的文章


综上所述,在进行项目时,评估当前设计方法是否符合当前需求非常重要。了解各个部分是如何工作的,了解各种方法的利弊,并解决手头的问题。实践一些伟大的公理会导致盲目的坚持,这可能会让你变成一个失败的人。

雷德盖特写了一篇关于这一点的伟大文章。

结论

  • 在适当的情况下,出于以下原因,使用VARCHAR(n)代替VARCHAR(MAX) 如果没有性能优势,设计也很好,因为VARCHAR(MAX) 数据不压缩
  • 存储大字符串比存储小字符串需要更长的时间
  • 将行内VARCHAR(最大)值从8000以下更新到8000以上 将