关于SQL Server,我了解:
var
表示内存是延迟分配的,这意味着它完全适合(插入时)数据。MAX
表示没有大小限制\限制。
那么,在使用MAX
时,是否总是最好使用varchar
,因为我们无论如何都不分配整个大小?
我们是否应该仅在要在此数据库列上强制执行约束的情况下才使用恒定大小?
关于SQL Server,我了解:
var
表示内存是延迟分配的,这意味着它完全适合(插入时)数据。
MAX
表示没有大小限制\限制。
那么,在使用MAX
时,是否总是最好使用varchar
,因为我们无论如何都不分配整个大小?
我们是否应该仅在要在此数据库列上强制执行约束的情况下才使用恒定大小?
VARCHAR(MAX)
列上放置索引.....如果您应该有一个索引,那不是一件好事!
Answers:
SO用户@Remus Rusanu在此主题上有一篇很好的文章。这是我窃取的摘要,但我建议您阅读全文:
处理MAX类型(varchar,nvarchar和varbinary)的代码路径不同于处理其等效非最大长度类型的代码路径。非最大类型可以在内部表示为普通的指针和长度结构。但是max类型不能在内部存储为连续的内存区域,因为它们可能增长到2Gb。因此,它们必须由类似于COM的IStream的流接口表示。这会延续到涉及最大类型的每个操作,包括简单的赋值和比较,因为这些操作在流接口上更加复杂。在分配和分配max-type变量的代码中(我的第一个测试),最大的影响是可见的,但是在每个操作上都可以看到影响。
在文章中,他展示了几个示例,这些示例说明使用varchar(n)通常可以提高性能。
您可以在此处找到整篇文章。
n
与varchar(n)
仍然使用获得的好处varchar(n)
?
这是微软推荐的:
只是在这一点上很明确,答案是否定的。始终最好使用varchar(N),如果知道大小不会变化,则使用char(N)。MAX类型不支持大多数本机SQL功能,因此不能添加索引,执行连接或对这些类型进行有效搜索。顺便说一句,这就是SQL Server中存在全文搜索功能的原因之一。
此外,varchar(max)阻止了对包含varchar(max)字段的整个表执行联机索引的功能。这将大大影响系统的性能。
仅当已知字段的大小超过8K时,才应使用Varchar(max)。在所有其他情况下,必须指定大小。否则会导致设计不佳,并且会导致除最琐碎的系统之外的任何系统上的性能问题。
一些参考: