nchar vs nvarchar性能

时间:2012-03-02 21:39:30

标签: sql-server database database-design

您如何决定是使用nvarchar还是nchar

例如我注意到sqlmembership provider创建的默认成员资格数据库声明Email列为nvarchar(256)

对我来说,这似乎是电子邮件列的不必要的最大值。我怀疑在正常情况下,超过40或50个字符的电子邮件将非常罕见。

但是,由于电子邮件地址等数据的长度不同,它们是否应始终存储为nvarchar以消除冗余空间?

如果将nvarchar用于电子邮件列。如果电子邮件地址被更改,如果新电子邮件比以前的电子邮件更长,这会导致许多页面拆分并因此导致大部分性能成本?

您是否会考虑将nchar(40)用于电子邮件地址并减少存储空间的损失,以换取无页面拆分性能成本?

或者使用nchar(40)会显着增加数据库大小,从而导致其他性能点击查询速度?

当您知道填充列的数据大小时,只会使用nchar吗?这是一个合理的规则吗?

1 个答案:

答案 0 :(得分:10)

  

超过40或50个字符的电子邮件将非常罕见

只需要一个就毁了你的模型......

  

如果新电子邮件比上一封电子邮件更长,则会导致许多页面拆分

没有。但即便如此,那也不是你设计数据模型的方式。让我们说,为了争论,每次更新电子邮件时都会导致页面拆分。你会优化那个吗?不,因为预分配大的固定大小(即使用NCHAR(256))要糟糕得多,它确实消除了更新时潜在的页面拆分(再次,如果这样的页面拆分但是,由于增加表格大小(转换为IO带宽和记忆消耗)的成本更高,请参阅Disk space is cheap...THAT'S NOT THE POINT!!!

为什么我说可变长度更新不会导致页面拆分?因为当行图像不再适合页面时强制页面拆分。对可变长度列的更新可能会导致行溢出,并使行保持与以前相同的大小,甚至更小。有些情况下,溢出后行的大小会增加,但有几个条件可以实际触发页面拆分:

  • 值更新必须触发行大小增加,这只有在从Table and Index Organization中描述的少于24字节指针的值更新到大于此指针大小的值时才会发生。
  • 行大小的增加(根据定义,每个正在更新的变量列最多增加24个字节,包括从NULL到非NULL的更新)必须导致一行不适合页面。
  • 在行中推送其他字段时,行中不应有可能的空间回收(即所有可变长度字段已经在行外推送)

我真的不认为你有如此奇怪和深奥的工作量,因为上述条件是 推动你的设计的主要因素。使用方便长度的NVARCHAR来适应您将遇到的任何值。