Oracle 行連鎖と行移行の違い

目次

行連鎖と行移行の違いのまとめ

いつ起こるか 仕組み 主な要因
行連鎖 Insert直後から。1行が1ブロックに収まらないほど大きい。 行が複数ブロックに分割 行サイズ > ブロックサイズ
行移行 Update 後。元は収まっていた行が更新でサイズが増え、同一ブロックに空きがなく別ブロックへ丸ごと移動。 元ブロックには転送ポインタだけ残り、行本体は別ブロックへ。インデックスROWIDは元の場所を指し続けるため追跡I/Oが発生。 PCTFREE不足、更新で可変長列が伸びた、ブロック空き不足。

行連鎖(Row Chaining)

原因:行サイズがブロックサイズを超えると発生します。

 

行移行(Row Migration)

原因:Insert時は収まっていたが、Update で行が伸び、同一ブロック内の余白が足りない。PCTFREEが低すぎる場合が多い。

PCTFREEとは

各ブロック内に「将来の Update のために残しておく空き領域の割合」を指定するパラメータです。

更新(Update)で可変長列が伸びやすい表にPCTFREEを大きめにすると、行移行(Row Migration)の発生を抑制できます。
逆に小さすぎると、更新時に同一ブロックに収まらず移行が起きやすくなります。

追記専用でほぼ更新なし(監査ログ等)の表の場合は、 PCTFREE を下げる(例:5–10%)と密度が上がります。

 

関連の記事

Oracleの概要と基本用語

△上に戻る