varchar(MAX)总是更好吗?

Ela*_*nda 66 sql t-sql sql-server

关于SQL Server,我理解:

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

  • MAX 意味着没有尺寸限制\限制.

那么,使用MAX时总是优先使用varchar,因为我们无论如何都不分配整个尺寸?

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

Abe*_*ler 54

SO User @Remus Rusanu有一篇关于这个主题的非常好的文章.这是我偷了一个snippit,但我建议你读完整个事情:

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

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

你可以在这里找到整篇文章.

  • 那么,您可以将“n”与“varchar(n)”一起使用的最大值是多少,才能仍然获得使用“varchar(n)”的好处? (3认同)

Gar*_*ger 15

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

我应该使用varchar(n)还是varchar(MAX)?

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


O.O*_*O.O 11

以下是微软推荐的内容:

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

REF

  • 我猜是因为声明可以使用VARCHAR(MAX)一切都错了? (3认同)

Sha*_*ane 7

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

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

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

一些参考: