是否总是首选varchar(MAX)?


74

关于SQL Server,我了解:

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

  • MAX 表示没有大小限制\限制。

那么,在使用MAX时,是否总是最好使用varchar,因为我们无论如何都不分配整个大小?

我们是否应该仅在要在此数据库列上强制执行约束的情况下才使用恒定大小?


4
这可能取决于数据库系统。您指的是哪一个?
jjmontes 2011年

1
此外,我还要补充说明,长度限制是数据模型约束的一部分,并且有些人也喜欢在该级别上非常严格。
jjmontes 2011年

10
还有一点:由于SQL Server中的索引条目最多只能为900个字节,因此您永远不能VARCHAR(MAX)列上放置索引.....如果您应该有一个索引,那不是一件好事!
marc_s

“仅当要在此数据库列上强制执行约束时,才应该使用恒定大小吗?” -您听起来好像这列是这两种可能性中较不常见的一种。我的经验告诉我相反。
2011年

答案是否定的,最好不要使用VARCHAR(MAX)。有关更多详细信息,请参见下文。
Shane

Answers:


59

SO用户@Remus Rusanu在此主题上有一篇很好的文章。这是我窃取的摘要,但我建议您阅读全文:

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

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

您可以在此处找到整篇文章。


1
此外,MAX类型还会阻止在线操作,至少不能支持SQL Server11。rusanu.com/2011/08/05/…–
Remus

1
那么,什么是你可以使用的最大值nvarchar(n)仍然使用获得的好处varchar(n)
Superdooperhero

@Superdooperhero,最大n为8000
星期六


14

这是微软推荐的:

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

参考


3
我猜是因为说可以将VARCHAR(MAX)用于所有内容是错误的吗?
HardCode

1
您当前编辑的答案与原始答案有很大的不同,无论您是否打算在原始答案中使用。
HardCode 2011年

1
第一个答案是错误的,所以我对此表示反对。您基本上暗示,可以随时随地使用varchar(max)而不造成任何后果。错误的答案值得(并得到)反对意见。
JNK

12

只是在这一点上很明确,答案是否定的。始终最好使用varchar(N),如果知道大小不会变化,则使用char(N)。MAX类型不支持大多数本机SQL功能,因此不能添加索引,执行连接或对这些类型进行有效搜索。顺便说一句,这就是SQL Server中存在全文搜索功能的原因之一。

此外,varchar(max)阻止了对包含varchar(max)字段的整个表执行联机索引的功能。这将大大影响系统的性能。

仅当已知字段的大小超过8K时,才应使用Varchar(max)。在所有其他情况下,必须指定大小。否则导致设计不佳,并且导致除最琐碎的系统之外的任何系统上的性能问题。

一些参考:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.