小编典典

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

sql

数据库引擎如何内部处理varchar列?

对于定义为的列char(100),DBMS在磁盘上分配100个连续字节。但是,对于定义为的列varchar(100),大概不是这种情况,因为的重点varchar是分配的空间不会超过存储该列中存储的实际数据值所需的空间。因此,当用户将一个包含空varchar(100)列的数据库行更新为一个包含80个字符的值时,那80个字符的空间是从哪里分配的呢?

看来,varchar至少在列值最初以空白或NULL插入,然后以实际值更新的情况下,列必须导致大量实际的数据库行碎片。与使用char类型值(存储在行中的列的空间连续分配)不同的是,这种碎片会导致数据库查询的性能下降吗?显然,使用varchar结果所占用的磁盘空间少于使用char所产生的磁盘空间,但是在优化查询性能时是否会对性能产生影响,尤其是对于在初始插入后其值经常更新的列而言?


阅读 292

收藏
2021-03-23

共1个答案

小编典典

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

对于MS Sql服务器,您可能要先了解页面-存储的基本单位(请参阅http://msdn.microsoft.com/zh-
cn/library/ms190969.aspx)

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

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

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

在这一点上,我还将推荐一本出色的书《 Microsoft Sql Server 2008内部原理》,以更深入地了解这种复杂的事情的真相!

2021-03-23