一. 概述、产生原因及影响
row migration:When a row is to be updated and it cannot find the necessary free space in its block,the oracle will move the entie row into a new block and leave a pointer from the orginal block to the new locatio.This process is called row migration
row chain:When a row is too large to fit into any block,row chaining occurs.In this case,the oracle devide the row into smaller chunks. each chunk is stored in a block along with the necessary poiters to retrive and assemble the entire row.
行迁移:当一个行上的更新操作(原来的数据存在且没有减少)导致当前的数据不能容纳在当前块,需要进行行迁移。行迁移意味着整行数据都被移动,原始的数据块上仅仅保留的是指向新块的一个地址信息(指针),并且该行原先空间不再被数据库使用,这些剩余的空间称之为空洞,也是产生表碎片的主要原因,表碎片基本上也是不可避免的,但是可以通过一些策略使其降低到一个可以接受的程度。注意,即使发生了行迁移,发生行迁移的行的rowid还是不会变化,这也是行迁移会引起数据库I/O性能降低的原因。可以认为行迁移是行链接的一种特殊形式,但是起因于行链接有很大不同。
产生:update
行链接:当一行数据太大而不能在一个单数据块容纳时,会产生行链接。例如当使用4kb的oracle数据块大小,而需要插入一行数据是8k,Oracle则需要使用三个数据块分成片来存储。因此,引起行链接的情形通常是,表上行记录的大小超出了数据库oracle块的大小。
产生原因:The row is too large to fit into one data block when it isfirstinserted.
表上使用了Long或Long raw数据类型的时候容易产生行链接(此时行链接通常为不可避免的)。其次表上使用多余255列时oracle会将这些过宽的表分片而产生行链接。
影响:行迁移对索引读产生额外的I/O,对全表扫描没什么影响。行连接则影响索引读和全表扫描。总的来说行迁移和行链接引起性能下降的原因主要是由于多余的I/O造成的。当通过索引访问产生行迁移的行时,数据库必须扫描一个或一个以上的数据块才能检索到该行的数据。
二. 模拟行迁移和行链接
行链接
------------------ 参考tom kyte的例子--------------------------------------------
--创建4k blocksize的表空间
SQL> alter system set db_4k_cache_size=1m scope=both;
System altered.
SQL> create tablespace tbs1 datafile '/u01/app/oracle/oradata/orcl/tbs_1.dbf' size 100m blocksize 4k;
Tablespace created.
--行链接测试
--使用定列宽的char类型来创建行链接测试表
SQL> create table row_chain_demo(
2 x int primary key,
3 a char(1000),
4 b char(1000),
5 c char(1000),
6 d char(1000)
7 ) tablespace tbs1;
Table created.
--插入数据
SQL> insert into row_chain_demo(x,a,