varchar(MAX)总是更好吗?

时间:2011-12-14 21:49:59

标签: sql sql-server tsql

关于SQL Server,我理解:

  • var表示内存是惰性分配的,这意味着它完全适合数据(插入时)。

  • MAX表示没有尺寸限制\限制。

然后,使用MAX时最好使用varchar,因为我们无论如何都不会分配整个大小?

只有在我们想要在此DB列上强制实施约束时,我们才应该使用常量吗?

4 个答案:

答案 0 :(得分:52)

SO User @Remus Rusanu有一篇关于这个主题的非常好的文章。这是我被盗的嗤之以鼻,但我建议你阅读整篇文章:

  

处理MAX类型的代码路径(varchar,nvarchar和   varbinary)与处理它们的代码路径不同   等效的非最大长度类型。非max类型可以在内部   表示为普通的指针和长度结构。但最大的   因为,类型不能在内部存储为连续的内存区域   他们可能会长到2Gb。所以他们必须由一个代表   流接口,类似于COM的IStream。这延续到了   涉及最大类型的每个操作,包括简单   分配和比较,因为这些操作更复杂   通过流媒体界面。最大的影响在代码中可见   分配和分配max-type变量(我的第一个测试),但是   每次操作都可以看到影响。

在文章中,他展示了几个示例,证明使用varchar(n)通常可以提高性能。

您可以找到整篇文章here

答案 1 :(得分:15)

在这里寻找一个好的答案:

Should I use varchar(n) or varchar(MAX)?

简短的回答是,从存储的角度来看,它是相同的,但从查询优化的角度来看,最好使用varchar(N)。

答案 2 :(得分:11)

以下是微软推荐的内容:

  • 当列数据条目的大小一致时使用char。
  • 当列数据条目的大小变化很大时使用varchar。
  • 当列数据条目的大小变化很大,并且大小可能超过8,000字节时,请使用varchar(max)。

ref

答案 3 :(得分:6)

在这个问题上非常明确,答案是否。最好使用varchar(N),如果你知道大小不会变化,那么char(N)。 MAX类型不支持也不支持大多数本机SQL功能,因此您无法添加索引,执行联接或对这些类型进行有效搜索。顺便说一句,这是SQL Server中存在全文搜索功能的一个原因。

此外,varchar(max)阻止对包含varchar(max)字段的整个表执行在线索引的能力。这将显着影响系统的性能。

只有在已知字段大小超过8K时才应使用Varchar(max)。在每个其他实例中,必须指定大小。如果不这样做是糟糕的设计,导致除了最微不足道的系统之外的任何问题都会出现性能问题。

一些参考文献: