是否有理由在SQL Server中使用Base2长度的列?

tra*_*vis 7 database sql-server database-design

可能的重复:
varchar字段 - 两个更高效的权力?
Nvarchar或varchar什么是最好使用乘以2或舍入全数?

出于纯粹的习惯,我将SQL Server中使用的列的大小定义为Base2大小.例如,这是我正在处理的表格:

  1. ID int
  2. FirstName nvarchar(64)
  3. LastName nvarchar(64)
  4. Col4 varchar(16)
  5. Col5 nvarchar(32)
  6. Col6 nvarchar(128)
  7. 等等...

我不知道这个习惯来自哪里,我不确定它是否有意义.以下表格定义是否会在某种程度上低于上述定义?

  1. ID int
  2. FirstName nvarchar(50)
  3. LastName nvarchar(50)
  4. Col4 varchar(10)
  5. Col5 nvarchar(30)
  6. Col6 nvarchar(100)
  7. 等等...

我想我的主要问题是:使用Base2列长度有合理的原因吗?

HLG*_*GEM 4

使列大于所需的大小可能会对数据库设计造成严重损害。来自博尔:

表每行最多可包含 8,060 字节。在 SQL Server 2008 中,对于包含 varchar、nvarchar、varbinary、sql_variant 或 CLR 用户定义类型列的表,此限制有所放宽。超过 8,060 字节行大小限制可能会影响性能,因为 SQL Server 仍保留每页限制为 8 KB。当 varchar、nvarchar、varbinary、sql_variant 或 CLR 用户定义类型列的组合超过此限制时,SQL Server 数据库引擎SQL Server Database Engine会将宽度最大的记录列移动到 ROW_OVERFLOW_DATA 分配单元中的另一个页,同时保持 24-原始页上的字节指针。当记录根据更新操作延长时,动态地将大记录移动到另一个页面。缩短记录的更新操作可能会导致记录移回 IN_ROW_DATA 分配单元中的原始页。此外,查询和执行其他选择操作(例如对包含行溢出数据的大型记录进行排序或联接)会减慢处理时间,因为这些记录是同步处理的,而不是异步处理的。

我发现如果你给他们额外的尺寸,他们迟早会使用它。此外,如果您将某些内容设置为 varchar (64) 并且实际上只需要最多 10 个字符,则更有可能有人将该字段用于其预期目的以外的用途,并且您会发现这些字段中的数据不正确(例如电话号码字段,其中包含有关办公室秘书的联系方式的注释,以选择一个不那么随机的示例)。

然而,至少这种设计比把所有东西都做成nvarchar(max)要好得多。