2010-10-19 52 views
7

可能重复:
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长度?

纯粹出于习惯,我定义我在SQL Server中使用的是和Base2大小列的大小。例如,下面是我的工作表:

  1. ID INT
  2. 名字为nvarchar(64)
  3. 姓氏为nvarchar(64)
  4. COL4 VARCHAR(16)
  5. COL5为nvarchar (32)
  6. COL6为nvarchar(128)
  7. 等...

我不知道这种习惯来自哪里,我不确定它是否有意义。下面的表格定义在某种程度上会比上面的定义效率低吗?

  1. ID INT
  2. 姓为nvarchar(50)
  3. 名字为nvarchar(50)
  4. COL4 VARCHAR(10)
  5. COL5为nvarchar(30)
  6. COL6为nvarchar(100)
  7. 等...

我想我的主要问题n是:是否有使用Base2色谱柱长度的合法理由?

+0

可能重复的[varchar字段 - 是两个更有效率的权力?](http://stackoverflow.com/questions/593364/varchar-fields-is-a-power-of-two-more-efficient)或者这个http://stackoverflow.com/questions/1374958 – gbn 2010-10-19 17:55:41

+0

很好的发现@ gbn,我猜这是一个骗局 – travis 2010-10-19 19:38:46

+0

我不能相信这个问题有多个副本 – 2010-10-20 01:56:59

回答

4

使列大于他们所需要的可能会对您的数据库设计产生积极的危害。来自BOL:

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

我发现如果你迟早给他们多余的大小,他们会使用它。此外,如果你设置了一些varchar(64),你只需要最多10个字符,你就会更有可能将某个人用于其他目的,而你会发现你在这些字段中得到了不好的数据就像一个电话号码字段,其中包含关于办公室秘书联系的笔记,以便选择一个不那么随意的例子)。

但是,至少这样的设计比创建所有的nvarchar(max)要好得多。

+0

varchar(64)而不是varchar(10)是一个糟糕的例子,因为在这种情况下varchar(16)已经被使用,只浪费4个字节的空间。 varchar(512)而不是varchar(300)将是浪费空间的一个更好的例子,可能会被滥用来存储大量额外的数据,而这些数据本来并不在该列中 – Dan 2017-06-06 17:40:38

+0

美国的电话号码通常存储在varchar(10 ) - 区号的3位数字,前缀的3位数字和后缀的4位数字。如果您需要存储国际电话号码,并且您存储了可能不同的号码中非数字部分。 – HLGEM 2017-06-06 17:44:16

1

不,这只是程序员的习惯,思考和行动的权力2 - 绝对没有从SQL Server的技术原因做到这一点 - 速度或性能没有增加或类似的东西。

0

令人怀疑。首先,列的确切长度主要是出于您自己的数据模式原因。其次,如果长度确实达到了效率,那么所有列的总长度可能是最重要的标准,即使如此,也会出现簿记开销,这意味着好的回合数不可能是最好的答案。

因此,您可能会发现关于将行大小限制为特定量的建议,以便整行可以放入页面中,或沿着这些行放置。这是为了减少每条记录的磁盘I/O数量。但是,各个色谱柱的大小无关紧要,总的来说就是这样。

0

这不是一个特别的SQL SErver问题......我在Oracle和MySQL中做同样的事情。没有什么特别的原因,除了这个事实,我可能更喜欢使用base2尺寸。

3

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

相关问题