仅使用10个字符的nvarchar(100)与nvarchar(255)的存储命中量是多少?

时间:2018-04-24 15:00:20

标签: sql-server sql-server-2014

我需要平衡可用磁盘空间和预期的数据大小。当有未使用的空间时,会发生什么样的存储打击?

示例:" dog"存储在nvarchar(10)vs nvarchar(100)中。如果我计划最坏的,并选择nvarchar(100)而不是nvarchar(10),如果我使用nvarchar(100),会浪费多少额外的磁盘空间?

2 个答案:

答案 0 :(得分:3)

nvarchar存储大小为每个字符2个字节+ 2个额外字节。列的最大长度无关紧要 - 存储大小由实际数据决定。

来自official documentation

  

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