您如何决定是使用nvarchar
还是nchar
?
例如我注意到sqlmembership provider创建的默认成员资格数据库声明Email列为nvarchar(256)
对我来说,这似乎是电子邮件列的不必要的最大值。我怀疑在正常情况下,超过40或50个字符的电子邮件将非常罕见。
但是,由于电子邮件地址等数据的长度不同,它们是否应始终存储为nvarchar以消除冗余空间?
如果将nvarchar用于电子邮件列。如果电子邮件地址被更改,如果新电子邮件比以前的电子邮件更长,这会导致许多页面拆分并因此导致大部分性能成本?
您是否会考虑将nchar(40)用于电子邮件地址并减少存储空间的损失,以换取无页面拆分性能成本?
或者使用nchar(40)会显着增加数据库大小,从而导致其他性能点击查询速度?
当您知道填充列的数据大小时,只会使用nchar吗?这是一个合理的规则吗?
答案 0 :(得分:10)
超过40或50个字符的电子邮件将非常罕见
只需要一个就毁了你的模型......
如果新电子邮件比上一封电子邮件更长,则会导致许多页面拆分
没有。但即便如此,那也不是你设计数据模型的方式。让我们说,为了争论,每次更新电子邮件时都会导致页面拆分。你会优化那个吗?不,因为预分配大的固定大小(即使用NCHAR(256))要糟糕得多,它确实消除了更新时潜在的页面拆分(再次,如果这样的页面拆分将但是,由于增加表格大小(转换为IO带宽和记忆消耗)的成本更高,请参阅Disk space is cheap...THAT'S NOT THE POINT!!!。
为什么我说可变长度更新不会导致页面拆分?因为当行图像不再适合页面时强制页面拆分。对可变长度列的更新可能会导致行溢出,并使行保持与以前相同的大小,甚至更小。有些情况下,溢出后行的大小会增加,但有几个条件可以实际触发页面拆分:
我真的不认为你有如此奇怪和深奥的工作量,因为上述条件是 推动你的设计的主要因素。使用方便长度的NVARCHAR来适应您将遇到的任何值。