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