数据库引擎如何内部处理varchar列?
对于定义为的列char(100),DBMS在磁盘上分配100个连续字节。但是,对于定义为的列varchar(100),大概不是这种情况,因为的重点varchar是分配的空间不会超过存储该列中存储的实际数据值所需的空间。因此,当用户将一个包含空varchar(100)列的数据库行更新为一个包含80个字符的值时,那80个字符的空间是从哪里分配的呢?
char(100)
varchar(100)
varchar
看来,varchar至少在列值最初以空白或NULL插入,然后以实际值更新的情况下,列必须导致大量实际的数据库行碎片。与使用char类型值(存储在行中的列的空间连续分配)不同的是,这种碎片会导致数据库查询的性能下降吗?显然,使用varchar结果所占用的磁盘空间少于使用char所产生的磁盘空间,但是在优化查询性能时是否会对性能产生影响,尤其是对于在初始插入后其值经常更新的列而言?
数据库引擎内部使用的数据结构要比您认为的要复杂得多!是的,存在碎片化问题,以及更新具有较大价值的varchar可能会导致性能下降的问题,但是,如果不更全面地了解所涉及的数据结构,很难解释/理解这些问题的含义。
对于MS Sql服务器,您可能要先了解页面-存储的基本单位(请参阅http://msdn.microsoft.com/zh- cn/library/ms190969.aspx)
就修补程序vs可变存储类型对性能的性能影响而言,需要考虑以下几点:
如您所见,情况相当复杂-一般而言,但是您可以相信数据库引擎非常擅长处理可变数据类型,并且当长度可能存在明显差异时,它们应该是首选的数据类型。列中保存的数据。
在这一点上,我还将推荐一本出色的书《 Microsoft Sql Server 2008内部原理》,以更深入地了解这种复杂的事情的真相!