重庆思庄Oracle、Redhat认证学习论坛

标题: 行迁移和行链接 [打印本页]

作者: zhouwei1990    时间: 2018-1-26 17:26
标题: 行迁移和行链接
行迁移:
Oracle的数据块会保留部分空间供以后更新使用。
PCTFREE定义一个块保留的空间百分比,默认是10,表示当数据块的可用空间低于10%后,就不可以被insert了,只能被update(具体看下面的PCTFREE介绍)。
当一条记录被更新时,数据库引擎首先会尝试在它保存的数据块中寻找足够的空闲空间,如果没有足够的空闲空间可用,这条记录将被拆分为两个部分,第一个部分进包括指向第二个部分的rowid,该部分任然保留在原来的数据块中,第二个部分包含所有的具体数据,将保存到另外一个新的数据块中,这个就成为行迁移。


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




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


带来的问题:
行迁移不会影响全扫描,因为第一个部分不包含数据,会被直接跳过;但对于通过rowid进行访问(索引扫描或者直接使用rowid查询),则开销会翻倍,主要由于一次读取需要访问两个块。
行链接则和数据访问方式无关,每次访问到第一个记录片段之后,都需要通过rowid去访问其他的记录片段。
行迁移和行链接也会影响行级锁,因为每个记录片段都需要持有锁,锁的开销和记录片段的个数的增长成正比。


分析:
$ORACLE_HOME/rdbms/admin/UTLCHAIN.SQL创建表
analyze table <table_name> list chained rows(会锁表)
select table_name,head_rowid from CHAINED_ROWS;


解决:
行迁移:
1.将迁移的数据复制到临时表中,在原表上删除再重新插入这些数据
2.通过导出、导入或者ALTER TABLE MOVE对表进行重整;
行链接:
只能通过修改块大小来解决。可通过将经常访问的字段放在前面,不经常访问的字段放在后面,以提升数据访问性能。







欢迎光临 重庆思庄Oracle、Redhat认证学习论坛 (http://bbs.cqsztech.com/) Powered by Discuz! X3.2