我需要在可用的磁盘空间与预期的数据大小之间取得平衡。当有未使用的空间时,会发生什么样的存储空间?
示例:"狗"存储在nvarchar(10(与nvarchar(100(中。如果我计划最糟糕的情况,然后选择nvarchar(100(而不是nvarchar(10(,如果我选择nvarchar(100((100(?
nvarchar
存储大小为每个char 2个字节2个字节。列的最大长度无关紧要 - 存储大小由实际数据确定。
官方文档:
nvarchar [(n | max(] 可变长度Unicode字符串数据。n定义字符串长度,可以是1到4,000的值。最大值表示最大存储大小为2^30-1字符。字节中的最大存储大小为2 GB。实际存储大小在字节中,是输入字符 2个字节的两倍。 nvarchar的ISO同义词是全国性char的变化,民族字符变化。
。
(强调我的(
但是,请不要考虑将nvarchar(max)
用于所有内容的建议。由于max
的处理方式不同,因此具有一些讨厌的副作用(性能命中(。
一般而言,您应该根据估计的实际数据大小选择列最大尺寸。为了安全起见,您可能只想将最大尺寸设置为预期尺寸的两倍。
如果您知道您只使用单个ASCII支持的语言,则应考虑使用varchar
而不是nvarchar
,因为它的存储大小是nvarchar
的存储大小的一半:
varchar [(n | max(] 变量长度,非unicode字符串数据。n定义字符串长度,可以是1到8,000的值。最大值表示最大存储大小为2^31-1字节(2 GB(。存储大小是输入的数据的实际长度 2个字节。 varchar的ISO同义词是char vary charvarying或cartaravarying
(再次,重点是我的(
据我所知,正如Zohar所提到的,存储的差异很小。
you 将,但是,请参阅对查询内存赠款的潜在影响,因此请参阅服务器的整体性能。由于查询引擎实际上不知道这些较大的字符串列的实际程度,因此它试图分配可能足够的内存,假设有许多填充列。
要进一步阅读,请转到此处。