行链接和行迁移

简介: 行链接和行迁移发生的原因和解决方法
行链接和行迁移
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


相关文章
|
4月前
|
缓存 编译器 API
【C/ C++链接】深入C/C++链接:从基础到高级应用(二)
【C/ C++链接】深入C/C++链接:从基础到高级应用
60 1
|
4月前
|
编译器 C++ 开发者
【C/ C++链接】深入C/C++链接:从基础到高级应用(一)
【C/ C++链接】深入C/C++链接:从基础到高级应用
80 0
|
弹性计算 黑灰产治理
阿里云学生服务器2023新版申请链接
阿里云学生服务器2023新版申请链接,2023阿里云学生服务器免费领取,先完成学生认证即可免费领取一台云服务器ECS,配置为2核2G、1M带宽、40G系统盘,在云服务器ECS实例过期之前,完成实验与认证任务,还可以免费续费6个月,阿里云百科来详细说下2023阿里云学生服务器活动、学生机配置、免费时长及学生服务器领取条件:
353 0
阿里云学生服务器2023新版申请链接
|
SQL 大数据 Java
数据库的内外链接和左右链接
数据库的内外链接和左右链接 30
146 0
数据库的内外链接和左右链接
|
物联网 开发工具
参考链接
参考链接
302 0
|
关系型数据库 数据库
DTS 数据源链接失败
DTS 数据源链接失败
2787 0
|
关系型数据库 Oracle 存储
|
数据库 关系型数据库 MySQL