Oracleの行移行・行連鎖が発生する原因
双方ともにパフォーマンスに影響がある為、可能な限り回避する設計・運用が必要。
行移行
Update によってレコード全体が長くなり、そのデータブロック中に更新した
レコード全体を格納する空き領域が足りない場合、レコード全体が別の
データブロックに移される。この状態を行移行という。
この時、元々データが入っていたデータブロックには、移行先ブロックの ROWID が入る。
ただし、移行先のデータブロックを丸々使っても格納できない場合は、行連鎖が発生する。
レコード長が増える場合や、更新後のレコード長に対して PCTFREE (空き領域)の
指定が小さすぎる場合などに発生してしまう。
移行後のデータにアクセスする時は、移行元と移行先の両ブロックにアクセス
しなければならない。これが行移行でパフォーマンスが劣化する原因というわけ。
行連鎖
1レコードが複数のデータブロックに跨って格納された状態を行連鎖という。
レコードのサイズが、ヘッダ領域は除くデータブロックサイズより大きい場合に発生する。
レコードデータはブロックに ROWID を持つことによって、分断されてもブロックが認識される。