行链接和行迁移

众所周知造成Oracle数据库性能低下的原因有很多,但是行链接和行迁移也很可能是其中原因之一。

 什么是行链接和行迁移?

1)该行太大,在它第一次插入时,无法放入一个数据块。

在行链接中,Oracle数据库将数据存储在为段保留的一个或多个被链接的数据块中。行链接最经常出现在大行中。例如包括包含LONG或LONG RAW数据类型列的行,或在2KB块中的VARCHAR2(4000)列,或具有大量列的行。在这些情况下出现链接行是不可避免的。

2)原先的行本来可以放入到一个数据块的,但是在更新后整体行长增加了,又没有足够可用空间来容纳更新的行。

在行迁移中,假设行可以容纳在一个新块中,Oracle数据库将会把整个行移动到一个新的数据块。原来的被迁移走的行块会包含一个指针或“转发地址”指向迁移到新块中的行。已迁移行的rowid不会改变。

3)超过255个列的行。

Oracle数据库在一个块行中只可以存储255的列。因此,如果你在具有1000个列的表中插入行,则数据库将创建4个快行,通常会链接多个块。

那么到底什么是行链接和行迁移呢?

行链接

如下图描述:向数据块中插入大行,行出入左边的块太大,所以数据库通过将第一个行块(row piece)放在左边的块,而将第二个行块(row piece)放入到右边的块中,这样就形成了行链接。

cncpt316

 

行迁移

如下图所示:左边的块包含的行被更新,但现在导致该行太大而不能放入块中。数据库将整个行移动到右边的块中,并在左边的块中保留一个指向被迁移行的指针。

cncpt306

根据上述概念总结:行链接一般发生在insert阶段(因数据块无法容纳过大数据);行迁移一般发生在update阶段(原数据块无法容纳增长的数据)

当行被链接或迁移时,检索数据所需的I/O灰增加。导致这种情况是因为Oracle数据库必须扫描更多块以检索行信息。例如,如果数据库执行一个I/O读取索引或者读取一个未迁移的表行,则需要额外的I/O才能获取迁移的数据行。

参考文档:
Chained and Migrated Rows
http://docs.oracle.com/cd/E11882_01/server.112/e40540/logical.htm#CNCPT1055

 

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据