Oracleの行移行・行連鎖が発生する原因

双方ともにパフォーマンスに影響がある為、可能な限り回避する設計・運用が必要。



行移行

Update によってレコード全体が長くなり、そのデータブロック中に更新した
レコード全体を格納する空き領域が足りない場合、レコード全体が別の
データブロックに移される。この状態を行移行という。

この時、元々データが入っていたデータブロックには、移行先ブロックの ROWID が入る。
ただし、移行先のデータブロックを丸々使っても格納できない場合は、行連鎖が発生する。

レコード長が増える場合や、更新後のレコード長に対して PCTFREE (空き領域)の
指定が小さすぎる場合などに発生してしまう。

移行後のデータにアクセスする時は、移行元と移行先の両ブロックにアクセス
しなければならない。これが行移行でパフォーマンスが劣化する原因というわけ。

行連鎖

1レコードが複数のデータブロックに跨って格納された状態を行連鎖という。
レコードのサイズが、ヘッダ領域は除くデータブロックサイズより大きい場合に発生する。
レコードデータはブロックに ROWID を持つことによって、分断されてもブロックが認識される。