行迁移与行链接

pc_free值:
PCTFREE定义一个块保留的空间百分比,默认是10,表示当数据块的可用空间低于10%后,就不能被insert了,只能被update。

行迁移:

当一条记录被更新时,数据库引擎首先会尝试在它保存的数据块中寻找足够的空闲空间,如果没有足够的空闲空间可用,这条记录将被拆分为两个部分,第一个部分进包括指向第二个部分的rowid,该部分任然保留在原来的数据块中,第二个部分包含所有的具体数据,将保存到另外一个新的数据块中,这个就成为行迁移。

为什么不将整行都放到新的数据块中?
原因是这样会导致该行数据rowid发生变化,而rowid被存储在索引中,也有可能被客户端临时保存在内存中,rowid的变化可能导致查询错误。

查询pct_free的值:
select table_name, pct_free from user_tables where table_name = 'TEST1';
调整pct_free的值:
alter table test1 pctfree 15;

行链接:

行链接和行迁移不同,行链接是当一条记录太大,在一个数据块中无法存入,这时会被拆分为2个或以上的部分,存储在多个块中,这多个块之间会构造一个链

行迁移是由于更新导致的,而行链接的原因则可能为:
1)直接插入大的记录;
2)更新记录导致记录大于一个数据块,在这时,这样记录可能会同时变为行迁移和行链接。

发生行迁移与行链接的处理
行迁移

首先我们应该避免行迁移,方法是在原块中保留足够的空闲空间,即调整PCTFREE参数值,值的大小需要评估记录扩展的平均大小。
当出现了行迁移后,则只能通过移动数据来解决,具体的方式有:
 1)通过导出、导入或者ALTER TABLE MOVE对表进行重整;
 2)将迁移的数据复制到临时表中,在原表上删除再重新插入这些数据。
行链接

处理行链接只能增加数据块的大小,但在一些情况下,可以通过将常用字段放在表的前面,不常访问的字段放在表的末尾来提高某些查询的效率(由于Oracle查询时只会取查询相关的字段)。

原文地址:https://www.cnblogs.com/Wardenking/p/10520833.html