关于SQL Server,我理解:
var
表示内存是惰性分配的,这意味着它完全适合数据(插入时)。
MAX
表示没有尺寸限制\限制。
然后,使用MAX
时最好使用varchar
,因为我们无论如何都不会分配整个大小?
只有在我们想要在此DB列上强制实施约束时,我们才应该使用常量吗?
答案 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)
以下是微软推荐的内容:
答案 3 :(得分:6)
在这个问题上非常明确,答案是否。最好使用varchar(N),如果你知道大小不会变化,那么char(N)。 MAX类型不支持也不支持大多数本机SQL功能,因此您无法添加索引,执行联接或对这些类型进行有效搜索。顺便说一句,这是SQL Server中存在全文搜索功能的一个原因。
此外,varchar(max)阻止对包含varchar(max)字段的整个表执行在线索引的能力。这将显着影响系统的性能。
只有在已知字段大小超过8K时才应使用Varchar(max)。在每个其他实例中,必须指定大小。如果不这样做是糟糕的设计,将导致除了最微不足道的系统之外的任何问题都会出现性能问题。
一些参考文献: