Sql server 2008 NVARCHAR使用的尺寸重要吗?
每次我创建一个表时,我都想知道,如果实际字符串大小小于Sql server 2008 NVARCHAR使用的尺寸重要吗?,sql-server-2008,Sql Server 2008,每次我创建一个表时,我都想知道,如果实际字符串大小小于100,那么无论我说nvarchar(100)还是nvarchar(1000),是否会有性能差异。有吗?根据: nvarchar[(n|max)] 可变长度Unicode字符串数据。n定义字符串长度,可以是1到4000之间的值。max表示最大存储大小为2^31-1字节(2 GB)以字节为单位的存储大小是输入数据的实际长度+2字节的两倍。 因此,在计算存储大小时,只有输入数据的实际长度才重要 文档没有说明它为什么会出现,但长度参数很有用,因为它
100
,那么无论我说nvarchar(100)
还是nvarchar(1000)
,是否会有性能差异。有吗?根据:
nvarchar[(n|max)]
可变长度Unicode字符串数据。n定义字符串长度,可以是1到4000之间的值。max表示最大存储大小为2^31-1字节(2 GB)以字节为单位的存储大小是输入数据的实际长度+2字节的两倍。
因此,在计算存储大小时,只有输入数据的实际长度才重要
文档没有说明它为什么会出现,但长度参数很有用,因为它强制执行简单的限制约束(例如,某些人不能输入2GB的文本作为“名称”)。由于nvarchar是一种可变长度的数据类型,它只会存储您分配给它的数据(每个字符2个字节)加上2个字节表示长度信息,主要用于双字节语言,如中文
就个人而言,当我知道某个限制(即URL查询字符串限制、文件路径szie限制或我自己的限制)时,我会使用varchar(n)。当最大长度未定义且可能超过8000个字符时,我使用varchar(max)。我几乎从不使用nvarchar,主要是因为我们的应用程序永远不会走向国际。当您需要nvarchar(10)时,您不应该使用nvarchar(1000)的原因是帮助防止错误数据输入数据库。除非你喜欢电话号码上写着“如果你想要一个真实的答案,就给胖秘书打电话,而不是那个可爱的秘书。”(这不是我在发给我们的一份实际客户文件中找到的随机例子)用户很快就会知道哪些字段足够大,可以用来存储注释,而随着时间的推移,这些字段中的数据往往会变得无用
至于nvarchar(Max),除非你期望超过4000个字符,否则使用它是个坏主意要了解原因。关于大小与性能,请记住SQL server将存储
nvarchar
/varchar
的初始数据值以及nchar
/char
的整个空间值。例如:nvarchar(1000)
存储数据时,测试数据最初将占用9*2字节的空间或18字节。而nchar(1000)
将占用1000*2字节(2000字节)的空间
然后,它继续在页面上添加下一组数据(8k),直到页面相遇(或接近)为表格设置的填充因子。然后开始一个新页面。现在,假设用户需要更新该数据,并在上一个字段中输入一些内容,假设长度为800个字符。现在,该值需要更新并将显著增长,但现在页面已满,并且当该字段的数据必须增长时,页面将变长eds进行拆分并为数据让路(除非填充因子足够低以允许增长)
这种页面分割将聚合为索引碎片,导致搜索/查找时间变慢,更新时间变长。因此,如果数据发生显著变化,可能会对性能产生不同的影响
通常情况下,答案是:“依赖”。至少在sql server数据库中,不允许对类型为nvarchar(max)的列创建唯一约束。要成功添加此约束,应将其限制为nvarchar(450)。是的,从性能角度来看,这很重要 查询优化器查看此元数据以计划查询。它根据提供的长度估计行大小,这可能会导致性能问题。例如,当您需要对varchar(10)列进行排序时,它可能计划在RAM上运行排序操作,但对varchar(1000)执行相同的查询可能计划在辅助存储上运行 我尝试使用领域知识并估计所需的大小。此外,您可能需要为将来的维护留出一些空间。例如,如果您认为您的数据最多可以包含50个字符,请使用varchar(70)而不是50个字符,以便它能够处理应用程序使用中不可预知的未来变化 我从这篇博文中了解到这一点(我不是作者):
注意:不要盲目选择较小的长度。更改字段大小可能会成为维护方面的一大难题。我记得我为LastName字段选择较小的长度时,一些用户因此无法在系统中注册。我们必须更新正在使用的关键数据库(增加字段长度需要时间),编译程序并重新部署。如果我选择了适当的字段大小,我可以避免所有这些麻烦
您可能还想了解nvarchar(max)和nvarchar(n)之间的区别,因为n>4000对4000使字段基本上与nvarchar(max)相似。()事实上,如果有一个单独的原因需要约束某些内容,那么这就是添加约束的一个很好的原因。可能有一个业务规则说“数据元素X可能永远不会超过Y个字符。”或者系统的另一部分可能存在约束,为了在整个系统中保持数据完整性,应在整个系统中保持该约束。正确。请注意nvarchar(最大值)存储方式不同,不应简单地用作nvarchar(x)的替代品,虽然。存储空间是一样的,但它更像一个BLOB而不是一个内联字段。我刚刚通过调整测试验证了@AndrewBarber的评论,使用nvarchar而不是varchar。我从@HLGEM的回答中得到提醒,在4000大小之后,nvarchar的行为会发生变化,这是一个转折点。文档没有这样做听听会发生什么