我需要平衡可用磁盘空间和预期的数据大小。当有未使用的空间时,会发生什么样的存储打击?
示例:" dog"存储在nvarchar(10)vs nvarchar(100)中。如果我计划最坏的,并选择nvarchar(100)而不是nvarchar(10),如果我使用nvarchar(100),会浪费多少额外的磁盘空间?
答案 0 :(得分:3)
nvarchar
存储大小为每个字符2个字节+ 2个额外字节。列的最大长度无关紧要 - 存储大小由实际数据决定。
nvarchar [(n | max)] 可变长度的Unicode字符串数据。 n定义字符串长度,可以是1到4,000之间的值。 max表示最大存储大小为2 ^ 30-1个字符。最大存储大小(以字节为单位)为2 GB。 实际存储大小(以字节为单位)是输入字符数的两倍+ 2个字节。 nvarchar的ISO同义词是国家字符变化和国家字符变化。
(强调我的)
但是,请不要认为这是建议使用nvarchar(max)
来解决所有问题。由于max
的处理方式不同,因此会产生一些令人讨厌的副作用(性能命中)。
一般来说,您应该根据估算的实际数据大小选择列最大尺寸。为了安全起见,您可能只想将最大尺寸设置为预期尺寸的两倍。
如果你知道,你只会使用一种支持ASCII的语言,那么你应该考虑使用varchar
而不是nvarchar
,因为它的存储大小是存储空间的一半大小nvarchar
:
varchar [(n | max)] 可变长度的非Unicode字符串数据。 n定义字符串长度,可以是1到8,000之间的值。 max表示最大存储大小为2 ^ 31-1个字节(2 GB)。 存储大小是输入数据的实际长度+ 2个字节。 varchar的ISO同义词是变形或字符变换
(再次强调我的)
答案 1 :(得分:3)
据我所知,正如佐哈所提到的,存储的差异非常小。
但是,会看到对查询内存授予的潜在重大影响,从而影响服务器的整体性能。由于查询引擎不知道这些较大的字符串列实际上有多满,它会尝试分配可能足够的内存(假设有很多填充列)。
如需进一步阅读,请转here。