设为首页 收藏本站
查看: 1283|回复: 0

[经验分享] oracle技术之行迁移和行链接

[复制链接]

尚未签到

发表于 2018-9-14 06:06:38 | 显示全部楼层 |阅读模式
  定义:
  行迁移:因为update、将行变长、原来的块已经放不下了、行被挪进新块、
  行链接:行一开始就太大、比如你插入了1w个字节的行、必须要分两个块存放、
  由此、行变长的时间先后可作为判断依据
  产生场景:
  行迁移
  Oracle会将整行的数据迁移到一个新的数据块上,而将该行原先的空间只放一个指针,指向该行的新的位置,并且该行原先空间的剩余空间不再被数据库使用,这些剩余的空间我们将其称之为空洞,这就是产生表碎片的主要原因,表碎片基本上也是不可避免的,但是我们可以将其降到一个我们可以接受的程度。注意,即使发生了行迁移,发生了行迁移的行的rowid 还是不会变化,这也是行迁移会引起数据库I/O性能降低的原因。
  行链接
  oracle会使用与该块链接的一块或多块数据块来容纳该行的数据。行连接经常在插入比较大的行时才会发生,如包含long, long row, lob等类型的数据。在这些情况下行链接是不可避免的。
  影响DB performance的表现形式
  读一行要读两个块,也就是要两次逻辑读
  insert or update的性能比较差
  利用索引查询已链接或迁移的行的select语句的性能比较差,因为他们需要额外的I/O
  如何才能检测到行迁移与行链接
  SQL> conn / as sysdba
  Connected.
  SQL> @?/rdbms/admin/utlchain.sql
  Table created.
  SQL> analyze table hr.DEPARTMENTS LIST CHAINED ROWS;
  Table analyzed.
  SQL> select * from chained_rows;
  no rows selected
  另外,如何获知行迁移(行链接)严重的表呢?
  DBA_TABLES视图的CHAINED_CNT列,该列有该表的链接行计数。
  尽管行迁移与行链接是两个不同的事情,但是在oracle内部,它们被当作一回事。所以当你检测行迁移与行链接时,你应该仔细的分析当前你正在处理的是行迁移还是行链接。
  处理方案

  o 在大多数情况下,行链接是无法克服的,特别是在一个表包含象LONGS, LOBs 等这样的列时。当在不同的表中有大量的链接行,并且哪些表的行的长度不是很长时,你可以通过用更大的block>  例如:当前你的数据库的数据块的大小为4K,但是你的行的平均长度为6k,那么你可以通过用8k大小的数据块来重建数据库的办法解决行链接现象。
  o 行迁移主要是由于设置的PCTFREE参数过小,导致没有给update操作留下足够的空闲空间引起。为了避免行迁移,所有被修改的表应该设置合适的 PCTFREE 值,以便在每个数据块内为数据修改保留足够的空间。可以通过增加PCTFREE值的办法来避免行迁移,但这种解决办法是以牺牲更多的空间为代价的,这也就是我们通常所说的以空间换效率。 而且通过增加PCTFREE值的办法只能缓解行迁移现象,而不能完全解决行迁移,所以较好的办法是在设置了合适的PCTFREE值的后,在发现行迁移现象比较严重时,对表的数据进行重组。下面是对行迁移数据进行重组的步骤(这种方法也被成为CTAS):
  -- Get the name of the table with migrated rows:
  ACCEPT table_name PROMPT 'Enter the name of the table with migrated rows: '
  -- Clean up from last execution
  set echo off
  DROP TABLE migrated_rows;
  DROP TABLE chained_rows;
  -- Create the CHAINED_ROWS table
  @.../rdbms/admin/utlchain.sql
  set echo on
  spool fix_mig
  -- List the chained and migrated rows
  ANALYZE TABLE &table_name LIST CHAINED ROWS;
  -- Copy the chained/migrated rows to another table
  create table migrated_rows as
  SELECT orig.*
  FROM &table_name orig, chained_rows cr
  WHERE orig.rowid = cr.head_rowid
  AND cr.table_name = upper('&table_name');
  -- Delete the chained/migrated rows from the original table
  DELETE FROM &table_name WHERE rowid IN (SELECT head_rowid FROM chained_rows);
  -- Copy the chained/migrated rows back into the original table
  INSERT INTO &table_name SELECT * FROM migrated_rows;
  spool off
  oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-581197-1-1.html 上篇帖子: Oracle 快速Drop大表 下篇帖子: linux命令的oracle运用(一)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表