与NVARCHAR一起使用的尺寸是否重要?

时间:2012-04-02 21:03:58

标签: sql-server-2008

每当我创建一个表时,我想知道假设实际字符串大小小于nvarchar (100),我是否说nvarchar (1000)100是否存在任何性能差异。那有吗?

6 个答案:

答案 0 :(得分:52)

根据the documentation

  

nvarchar [(n | max)]

     

可变长度的Unicode字符串数据。 n定义字符串长度,可以是1到4,000之间的值。 max表示最大存储大小为2 ^ 31-1个字节(2 GB)。 存储大小(以字节为单位)是输入数据的实际长度的两倍+ 2个字节。

因此,在计算存储大小时,只有输入数据的实际长度才有意义。

文档没有说明原因,但长度参数很有用,因为它强制执行简单的限制约束(例如,有人不能输入2 GB的文本作为“名称”)。

答案 1 :(得分:18)

当您需要nvarchar(10)时,不应该使用nvarchar(1000)的原因是为了防止将错误数据输入数据库。除非你喜欢它,否则电话号码会说“如果你想要一个真正的答案,就叫那个胖胖的秘书而不是可爱的秘书”。(不是那么随机的例子我曾经发现给我们的实际客户档案)用户会很快找到答案哪些字段足够大,以至于他们可以使用它们来存储笔记,这些笔记往往会使字段中的数据随着时间的推移变得无用。

至于nvarchar(Max),除非你期望有超过4000个字符,否则根本不使用它。查找索引和varchar(max)以查看原因。

答案 2 :(得分:7)

关于大小与性能,请记住SQL Server将存储nvarchar / varchar数据的初始值以及nchar / char的整个值空间条款。例如:nvarchar(1000),数据存储为test data,最初将占用9 * 2字节的空间或18字节。虽然nchar(1000)无论如何都需要1000 * 2字节(2000字节)。

然后它继续以愉快的方式在页面上添加下一组数据(即8k),直到页面满足(或接近)表的填充因子集。然后开始一个新页面。现在让我们假设一个用户需要更新这些数据并在前一个字段中输入一些内容,让我们说800字符长。现在该值需要更新并且将显着增长,但现在页面已满,当该字段的数据必须增长时,页面需要拆分并为数据腾出空间(除非填充因子足够低以允许增长)。

该页面拆分将聚合为索引碎片,导致搜索/搜索时间更慢,更新时间更长。因此,如果数据发生显着变化,则对性能的影响可能会有所不同。

通常情况下,答案是:“取决于”。

答案 3 :(得分:4)

是的,从性能的角度来看,这很重要。

查询优化工具会查看此元数据以规划查询。它会根据提供的长度估算行大小,这可能会导致性能问题。例如,当您需要对varchar(10)的列进行排序时,它可能计划在RAM上运行排序操作,但可能计划在辅助存储上运行相同的varchar(1000)查询。

我尝试使用领域知识并估算所需的大小。此外,您可能需要为将来的维护留出一些空间。例如,如果您认为您的数据最多可包含50个字符,请使用varchar(70)而不是50,以便它可以处理应用程序使用中不可预测的未来更改。

我从这篇博文中了解到这一点(我不是作者):http://aboutsqlserver.com/2010/08/18/what-is-the-optimal-size-for-variable-width-columns/

注意:不要盲目选择较小的长度。改变字段大小可能会成为一个很大的维护问题。我记得当我为LastName字段选择一个小长度时,有些用户因此而无法在系统中注册。我们必须更新正在使用的关键数据库(增加字段长度需要时间),并编译程序并重新部署。如果我选择了适当的字段大小,我可以避免所有这些麻烦。

您可能还想了解nvarchar(max)和nvarchar(n)之间的差异,因为n> 4000,4000使得该字段与nvarchar(max)基本相似。 (Are there any disadvantages to always using nvarchar(MAX)?

答案 4 :(得分:1)

由于nvarchar是一个可变长度的数据类型,它只存储你赋给它的数据(每个字符2个字节)加上2个字节的长度信息,主要用于像中文这样的双字节语言。

就个人而言,当我知道某个限制(即URL查询字符串限制,文件路径szie限制或我自己的限制)时,我使用varchar(n)。当最大长度未定义时,我使用varchar(max),它可以超过8000个字符。我几乎从不使用nvarchar主要是因为我们的应用程序永远不会走向国际化。

答案 5 :(得分:1)

至少在sql server数据库中,不允许对列创建唯一约束,其类型为nvarchar(max)。应该限制​​为nvarchar(450)以成功添加此约束。