前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >混淆的行迁移和行链接

混淆的行迁移和行链接

作者头像
bisal
发布2019-06-22 14:16:26
7680
发布2019-06-22 14:16:26
举报
文章被收录于专栏:bisal的个人杂货铺

开发提出需求,要向一张已经包含100多个字段的表再新增字段,技术上可行,但是这种操作,究竟有何副作用?

这里就引出了行迁移和行链接这两个容易混淆的概念,整理一下,算是让自己重新认识下。

《Concept》对这两个概念的解释:

当第一次向表中插入行,由于行太长,不能存储在一个数据块中时,就会发生行链接,此时,数据会被拆成2个或者多个部分,存储在多个数据块中,这些数据块会构成链式结构,因此叫做行链接。下图就是行链接,左边的数据块,存储了插入数据的第一部分,以及行片段指针,右边的数据块存储了行数据的第二个部分,两个数据块,通过链条关联。例如2K的数据块,行中包含LONG、LONG RAW、VARCHAR2(4000)这种大字段,或者一张表有很多的字段,在这些场景下,行链接是不可避免的。另外,11g下一个行片段中只能包含255个列,插入一个1000个字段的行,就会被分为4个片段存储在不同的数据块中,通过链条关联,

640?wx_fmt=png
640?wx_fmt=png

每张表都会有pctfree这个参数,指定了数据块中为更新操作预留的空间百分比,默认是10,当数据块的可用空间低于10%的时候,就不能插入,只能更新了。更新一条已存在的行,当所在的数据块没有足够的空间容纳,就会发生行迁移。此时,该数据块只会存储一个新块的rowid,这个新块则包含了原始行的数据,为了避免rowid改变导致查询出错,因此原始行rowid不变,该行原始空间的剩余空间不再被数据库使用,可以说这是表产生碎片的主要原因,一定意义上,表产生碎片是不可避免的,

640?wx_fmt=png
640?wx_fmt=png

当更新的记录导致记录大于一个数据块时,就会同时发生行迁移和行链接,因此行迁移是一种特殊的行链接。

行迁移对于全表扫描,没影响,因为第一个数据块只有rowid,没有数据,所以会被跳过,只会扫描第二个数据块,但是使用rowid的扫描,需要读取迁移前(迁移后数据块的rowid)和迁移后(行数据)的两个数据块,如果表中有大量的行迁移,就需要消耗更多IO完成数据的检索。同时,行锁开销会增加,因为每个行片段,都需要持有锁的。

从现象上看,发生行链接和行迁移,可能导致INSERT、UPDATE和通过索引执行的SELECT操作缓慢,原因就是需要消耗更多的IO,读取更多数据块。对于行迁移,可以考虑表的pctfree是否需要调整,数据块大小是否需要调整。对于行链接,可能需要考虑表的设计,是真的合理?如果业务上是,这种情况,就不可避免了。

其实无论如何设计表,行链接和行迁移,或许都可能发生,此时就看多消耗的这些IO,以及锁的开销,能不能成为性能问题的主要矛盾了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年06月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档