varchar是否会因数据碎片而导致性能下降?

E B*_*own 9 sql database database-design

varchar列如何由数据库引擎在内部处理?对于定义为char(100)的列,DBMS在磁盘上分配100个连续字节.但是对于定义为varchar(100)的列,可能并非如此,因为varchar的整个点不会分配比存储列中存储的实际数据值所需的更多空间.因此,当用户将包含空varchar(100)列的数据库行更新为包含80个字符的值时,该80个字符的空间从哪里分配?似乎varchar列必须导致实际数据库行的大量碎片,至少在最初将列值插入为空或NULL的情况下,然后使用实际值进行更新.这种碎片是否导致数据库查询性能下降,而不是使用char类型值,其中存储在行中的列的空间是连续分配的?显然使用varchar会产生比使用char更少的磁盘空间,但是在优化查询性能时会出现性能损失,特别是对于在初始插入后经常更新其值的列?

Lar*_*tig 7

你在问题中做了很多假设,但这些假设并不一定正确.

除非文档清楚地告诉您数据的存储方式,否则任何DBMS中a列的类型都不会告诉您存储该数据的性质.如果没有说明,您不知道它是如何存储的,DBMS可以自由地将存储机制从发行版更改为发行版.

事实上,有些数据库在内部将CHAR字段存储为VARCHAR,而其他数据库则根据声明的列大小决定如何存储列.某些数据库将VARCHAR与其他列存储在一起,一些存储BLOB数据,另一些存储实现其他存储,某些数据库在更新列时始终会重写整行,而其他数据库则不会.一些pad VARCHAR允许有限的将来更新而无需重新定位存储.

DBMS负责确定如何存储数据并以快速一致的方式将其返回给您.通常在检测到任何性能问题之前,总是让我感到惊讶的是有多少人尝试考虑数据库.


Jus*_*tin 5

数据库引擎中使用的数据结构比您想象的要复杂得多!是的,存在碎片问题以及更新具有大值的 varchar 会导致性能下降的问题,但是如果没有更全面地了解所涉及的数据结构,则很难解释/理解这些问题的含义。

对于 MS Sql 服务器,您可能希望从了解页面开始 - 存储的基本单位(请参阅http://msdn.microsoft.com/en-us/library/ms190969.aspx

就修复与可变存储类型对性能的性能影响而言,需要考虑以下几点:

  • 使用可变长度列可以提高性能,因为它允许在单个页面上容纳更多行,这意味着读取次数更少
  • 使用变长列需要特殊的偏移值,这些值的维护需要轻微的开销,但是这种额外的开销通常可以忽略不计。
  • 另一个潜在成本是当包含该行的页面几乎已满时增加列大小的成本

正如您所看到的,情况相当复杂 - 一般来说,您可以相信数据库引擎非常擅长处理可变数据类型,并且当长度可能存在显着差异时,它们应该是首选的数据类型列中保存的数据。

在这一点上,我还将推荐一本优秀的书“Microsoft Sql Server 2008 Internals”,以便更深入地了解这样的事情到底有多复杂!