什么是行链接和行迁移?
1)该行太大,在它第一次插入时,无法放入一个数据块。
在行链接中,Oracle数据库将数据存储在为段保留的一个或多个被链接的数据块中。行链接最经常出现在大行中。例如包括包含LONG或LONG RAW数据类型列的行,或在2KB块中的VARCHAR2(4000)列,或具有大量列的行。在这些情况下出现链接行是不可避免的。
2)原先的行本来可以放入到一个数据块的,但是在更新后整体行长增加了,又没有足够可用空间来容纳更新的行。
在行迁移中,假设行可以容纳在一个新块中,Oracle数据库将会把整个行移动到一个新的数据块。原来的被迁移走的行块会包含一个指针或“转发地址”指向迁移到新块中的行。已迁移行的rowid不会改变。
3)超过255个列的行。
Oracle数据库在一个块行中只可以存储255的列。因此,如果你在具有1000个列的表中插入行,则数据库将创建4个快行,通常会链接多个块。
那么到底什么是行链接和行迁移呢?
行链接
如下图描述:向数据块中插入大行,行出入左边的块太大,所以数据库通过将第一个行块(row piece)放在左边的块,而将第二个行块(row piece)放入到右边的块中,这样就形成了行链接。
行迁移
如下图所示:左边的块包含的行被更新,但现在导致该行太大而不能放入块中。数据库将整个行移动到右边的块中,并在左边的块中保留一个指向被迁移行的指针。
根据上述概念总结:行链接一般发生在insert阶段(因数据块无法容纳过大数据);行迁移一般发生在update阶段(原数据块无法容纳增长的数据)
当行被链接或迁移时,检索数据所需的I/O灰增加。导致这种情况是因为Oracle数据库必须扫描更多块以检索行信息。例如,如果数据库执行一个I/O读取索引或者读取一个未迁移的表行,则需要额外的I/O才能获取迁移的数据行。