Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 NVARCHAR使用的尺寸重要吗?_Sql Server 2008 - Fatal编程技术网

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的行为会发生变化,这是一个转折点。文档没有这样做听听会发生什么