我有一个存储数百万行的SQL Server 2008数据库。有几个NVARCHAR列永远不会超过列的当前最大长度,也不会因应用程序限制而接近它。
即。 Address NVARCHAR字段的长度为50个字符,但它永远不会超过32个字符。
对于我来说,将NVARCHAR列的大小减小到实际最大长度(即地址字段为32个字符)时,是否有性能优势或节省空间的好处。或者它是否会有所不同,因为它是一个可变长度的字段?
答案 0 :(得分:2)
设置NVARCHAR中的字符数主要用于验证目的。如果您不希望数据超过50个字符,那么数据库将通过不允许额外数据为您强制执行该规则。
如果总行大小超过阈值,那么它可能会影响性能,因此通过限制长度,您可以通过不允许行大小超过该阈值而受益。但在你的情况下,这似乎并不重要。 这样做的原因是SQL Server可以在页面上放入更多行,这样可以减少磁盘I / O,并且可以在内存中存储更多行。
此外,SQL Server中的最大行大小为8KB,因为它是页面的大小,行不能跨越页面边界。如果插入超过8KB的行,额外数据将存储在行溢出页面中,这可能会对性能产生负面影响。
答案 1 :(得分:2)
将n/var/char
列定义缩减到最大长度,没有预期的性能或节省空间的好处。但是,可能还有其他好处。
在不产生错误的情况下,该列不会意外地插入更长的值(对于设计良好的系统的“快速失败”特性是理想的)。
该列与下一位开发人员进行沟通,检查表中有关数据的内容,这有助于理解。没有开发人员会对数据的目的感到困惑,并且不得不花费时间来确定代码的字段验证规则是否错误或者列定义是否错误(因为它们在逻辑上应该匹配)。
如果您的色谱柱确实需要延长,您可以提前确定可能的后果。精通数据库的专业人员可以利用这个机会查看需要新列长度的即将到来的值是否会对现有行或查询性能产生负面影响 - 因为每行数据量会影响读取次数需要满足查询。