【问题标题】:Is there a reason to use Base2 lengths for columns in SQL Server? [duplicate]是否有理由在 SQL Server 中为列使用 Base 2 长度? [复制]
【发布时间】:2010-10-19 16:21:44
【问题描述】:

可能的重复:
varchar Fields - Is a Power of Two More Efficient?
Nvarchar or varchar what is better use multiply of 2 or rounded full numbers??

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

  1. ID 整数
  2. 名字 nvarchar(64)
  3. 姓氏 nvarchar(64)
  4. Col4 varchar(16)
  5. Col5 nvarchar(32)
  6. Col6 nvarchar(128)
  7. 等等……

我不知道这个习惯是从哪里来的,我也不确定它是否有意义。下面的表格定义在某些方面会比上面的效率低吗?

  1. ID 整数
  2. 名字 nvarchar(50)
  3. 姓氏 nvarchar(50)
  4. Col4 varchar(10)
  5. Col5 nvarchar(30)
  6. Col6 nvarchar(100)
  7. 等等……

我想我的主要问题是:使用 Base2 列长度是否有任何正当理由?

【问题讨论】:

标签: sql-server database database-design


【解决方案1】:

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

一个表每行最多可以包含 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 数据库引擎将具有最大宽度的记录列移动到 ROW_OVERFLOW_DATA 分配单元中的另一个页面,同时保持 24-原始页面上的字节指针。将大记录移动到另一个页面是动态发生的,因为记录基于更新操作而被延长。缩短记录的更新操作可能会导致记录移回 IN_ROW_DATA 分配单元中的原始页面。此外,查询和执行其他选择操作,例如对包含行溢出数据的大型记录进行排序或连接会减慢处理时间,因为这些记录是同步处理的,而不是异步处理的。

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

但是至少这种设计比制作所有内容都好得多 nvarchar (max)。

【讨论】:

  • varchar(64) 而不是 varchar(10) 是一个不好的例子,因为在这种情况下会使用 varchar(16),这只会浪费 4 个字节的空间。 varchar(512) 而不是 varchar(300) 将是浪费空间的一个更好的例子,可能会被滥用来存储大量不应该在该列中的额外数据
  • 美国电话号码通常存储在 varchar (10) 中——区号为 3 位,前缀为 3 位,后缀为 4 位。如果您需要存储国际电话号码,并且您存储了可能不同的号码的非数字部分。
【解决方案2】:

没有理由这样做,特别是对于 (n)varchar 数据,其中存储大小是数据的实际长度 + 2 个字节。

【讨论】:

    【解决方案3】:

    不,这只是程序员的习惯,以 2 的幂来思考和行动 - SQL Server 绝对没有技术理由这样做 - 不会提高速度或性能或类似的东西。

    【讨论】:

      【解决方案4】:

      怀疑。首先,列的确切长度主要出于您自己的数据模式原因。其次,如果长度确实影响效率,那么所有列的总长度可能是最重要的标准,即使这样,也会有记账开销,这意味着一个好的整数不太可能是最佳答案。

      因此,您可能会找到有关将行大小限制为特定数量的建议,以便整行适合一个页面,或类似的内容。这是为了减少每条记录的磁盘 I/O 数量。但是各个列的大小并不重要,重要的是总数。

      【讨论】:

        【解决方案5】:

        这不是一个专门的 SQL SErver 问题...我在 Oracle 和 MySQL 中做同样的事情。除了我觉得使用 base2 尺寸更舒服之外,没有什么特别的原因。

        【讨论】:

          猜你喜欢
          • 2015-04-29
          • 2017-08-12
          • 1970-01-01
          • 1970-01-01
          • 2014-04-16
          • 2012-01-11
          • 2017-11-18
          • 1970-01-01
          • 2020-01-14
          相关资源
          最近更新 更多