当前位置: 首页 > 面试题库 >

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

倪德业
2023-03-14
问题内容

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

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

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


问题答案:

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

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

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

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

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

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



 类似资料:
  • 我不熟悉Kinesis数据流,我想知道Kinesis数据流的行为是否类似于DDB流中的DynamoDB流行为,一个分区键只能属于一个shard,而一个shard可以容纳多个键。 Kinesis数据流也是如此吗?

  • 问题内容: 我有一个经典的Java EE系统,具有JSF的Web层,用于BL的EJB 3和用于对DB2数据库进行数据访问的Hibernate 3。我在以下情况下苦苦挣扎:用户将启动一个过程,该过程涉及从数据库中检索大型数据集。检索过程花费一些时间,因此用户不会立即收到响应,变得不耐烦,并打开新的浏览器并再次启动检索,有时是多次。EJB容器显然没有意识到第一次检索不再相关的事实,并且当数据库返回结果

  • 问题内容: 我的程序规格如下。1.所有四个数字都不同。2.千位数字是十位数的三倍。3.数字是奇数。4.数字的总和是27。我遗漏了整个程序的一些代码。它具有干净的编译器,但运行时会自动终止。我认为问题出在数据类型的转换中。 问题答案: 仅此一项就确保了while循环将永远不会进入,因为它是false。while循环中的任何内容都没有任何区别,因为它将永远不会执行。 你可能想写 除了此错误外,您的情况

  • 这只是出于好奇。 如果是这样,那么扩展到一个极端的情况,如果您的内存以某种方式结束了超级碎片(例如,每隔一个字节都被分配为ala 我想站台不重要? 很抱歉提出了一个扩展的问题,但这也会发生在其他语言中吗,比如Java/C#?

  • 问题内容: 如果是这样,为什么呢?我的意思是,tinyint的搜索比int更快吗? 如果是这样,那么实际的性能差异是什么? 问题答案: 是的,根据数据类型,确实会有所不同。 vs.不会在速度上产生明显的差异,但是会在数据大小上产生差异。假设是1个字节,而不是4个字节,则每行保存3个字节。一段时间后加起来。 现在,如果它反对,那么将会有些下降,因为整数值之类的排序操作比字符串值要快得多。 如果它是可

  • 我正在使用ASP. net开发一个网站,我的数据库是MYSQL。 在那里,我不希望用户限制只发布英文内容到我的网站。所以为了支持多语言,我决定使用Charset作为Utf8MB4,使用归类作为utf8_general_ci。 所以现在我有几个问题。 1) 我是否应该将数据库的字符集设置为Utf8MB4,并对utf8\u general\u ci进行排序? 2) 使用数据库的字符集Latin1和排序