暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

oracle 行链接和行迁移

原创 四九年入国军 2024-08-23
105


在Oracle中,当一行数据过长导致单个数据块存储不了的时候,就会发生两件事情:

行链接(Row Chaining)--搬走部分,留个指针
   这种情况发生在第一次插入的时候,由于行太长而一个数据块无法容纳的时候(例如LONG、LOB等类型的数据),
   Oracle会使用与该块链接的一个或多个数据块来存储该行的数据,行链接通常由insert操作引起;
   

行迁移(Row Migration--搬走整行,留个指针
   这种情况发生在对一行数据进行更新操作导致当前数据增加,当前块已经不足以容纳此行数据,这时候Oracle将会迁移整行数据到一个新的数据块。
   一个行迁移即表示整行数据都将会移动,原数据块仅保留指向新数据块的一个地址信息,行的ROWID是不会改变的,发生行迁移主要是由于表上的PCTFREE参数过小,
   所以需要设置一个合理的PCTFREE参数,行迁移通常由UPDATE操作引起
   



测试表是否存在行迁移:
缺点:命令会对表持有表级锁,进而阻塞其他针对该表的DML操作;
@?/rdbms/admin/utlchain.sql
//脚本内容
create table CHAINED_ROWS (
  owner_name         varchar2(30),
  table_name         varchar2(30),
  cluster_name       varchar2(30),
  partition_name     varchar2(30),
  subpartition_name  varchar2(30),
  head_rowid         rowid,
  analyze_timestamp  date
);


--分析
ANALYZE TABLE t1 LIST CHAINED ROWS INTO CHAINED_ROWS;



--查看分析结果
  SELECT owner_name, table_name, count(head_rowid) row_count
    FROM chained_rows
   GROUP BY owner_name, table_name;


根本性解决方案:     针对XXX表,及检查到的类似的表,通过DBMS_REDEFINITION的包重定义表,消除行迁移;
                 其他表如果存在日常业务大量导致字段长度变长的update操作,在重定义时,增加表的pct_free值。


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论