行链接和行迁移

简介: 行链接和行迁移发生的原因和解决方法
行链接和行迁移
1)什么是行链接和行迁移
①行链接:指一行存储在多个块中的情况,即行链接是跨越多块的行。
②行迁移:指一个数据行由于update语句导致当前块被重新定位到另一个块(那里有充足的空间)中,但在原始块中会保留一个指针。原始块中的指针是必需的,因         为索引的ROWID项仍然指向原始位置。
        行迁移是update语句当pctfree空间不足时引起的,它与insert和delete语句无关。

2)如何知道发生了行链接或行迁移
查看dba_tables的AVG_ROW_LEN列和CHAIN_CNT列。当CHAIN_CNT有值时,看AVG_ROW_LEN,它表示行的平均长度(byte),如果AVG_ROW_LEN<块大小,发生的是行迁 移,否则可能有行链接。

测试:
(一)行迁移
1、构建环境

f5c2dfd212aa56a57eec031d540468887ffa1dba

2、先分析一下test表,确定无行迁移
analyze table test compute statistics;
067cc7f2251856d248ba4dd922f233b7d720330d

可以观察到表test使用了5个块,行平均大小为3。
3、v$bh视图可以显示出t1表一共分配了8个块,具体是那些块。

4aa43209cac55cfc22c0be8299d7b58f618b31c2

4、填充这些空列,再分析test,有了行迁移

17e4054c0d42649010ec5b0593841864f035756a

说明1000行中有865行发生了行迁移,使用的块也增加了,从之前的5个增加到了13个。

5、怎样确定那些行发生了行迁移
SQL> @/u01/oracle/rdbms/admin/utlchain.sql
SQL> analyze table scott.t1 LIST CHAINED ROWS;
SQL> select count(*) from chained_rows;

1b517f8037a93ae44f5a346cb4509be6ce24354e

通过chained_rows表可以看到发生行迁移的列。
SQL> select table_name, HEAD_ROWID from chained_rows where rownum<=3;

bdcb11a51c0e7814f8e588eca70ac7bb0d48623c

Select dbms_rowid.ROWID_RELATIVE_FNO(rowid) fn,dbms_rowid.rowid_block_number(rowid) bn, rowid,c1 from test where rowid='AAASRpAAEAAAAE+AGl';
7f15500dcd655ee42f30f06977c2f44a69153147

6、解决行迁移的多方法
①移动表
  alter table test move;
17b94d759e2853e3f52c27ed0fa1aa6054eac477

②删除发生行迁移的行重新插入
SQL>create table test1 as select * from test where rowid in (select HEAD_ROWID from chained_rows);
SQL>delete test where rowid in (select HEAD_ROWID from chained_rows);
SQL>insert into test select * from test1;
SQL>drop table test1;
3a70256eadf823e589b2ca7ee848915cb9dbde51
896fe2fe5fba12d0e99a54f5caeda0f53b775621


(二)行链接
1、创建环境
SQL>create table t1 (c1 varchar2(3000),c2 varchar2(3000),c3 varchar2(3000));
SQL>insert into t1 values(lpad('a',3000,'*'),lpad('b',3000,'*'),lpad('c',3000,'*'));
SQL>commit;
SQL>analyze table t1 compute statistics;
SQL>select table_name, AVG_ROW_LEN,CHAIN_CNT from user_tables where table_name='T1';
8f73b963457aed6e7d09a20c84ed2c4b19bb7948

2、解决方法
SQL>create tablespace ttt datafile '/u01/oradata/vbox8db/ttt01.dbf' size 10m blocksize 16k;
SQL>alter table t1 move tablespace ttt;
SQL>analyze table t1 compute statistics;
SQL>select table_name, AVG_ROW_LEN,CHAIN_CNT from user_tables where table_name='T1';

3c8e82a56a2bed52fa7a6f22dac2de797aabfae9


相关文章
|
Ubuntu Unix Linux
Linux操作系统选择题之用户与组
Linux操作系统选择题之用户与组
353 0
|
12天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1253 5
|
1天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
11天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1274 87
|
11天前
|
云栖大会
阿里云云栖大会2025年9月24日开启,免费申请大会门票,速度领取~
2025云栖大会将于9月24-26日举行,官网免费预约畅享票,审核后短信通知,持证件入场
1821 13