行連鎖とは
データ挿入時に発生する現象
行連鎖とは 1 レコードの実サイズがデータブロックのデータ領域を超える場合(LONGを使用しているなど)に発生する。
データは 1 ブロックに収まらずに、2 つ以上の行断片(レコードピース)に分割して格納される。
行連鎖による行断片の連鎖の状態は、行ディレクトリに連鎖先のROWIDを格納する一方向の線形リストで管理されている。
行連鎖が発生したレコードの読み込みに最低 2 ブロック必要になるので効率が悪く、
データブロックサイズを大きくすること(またはテーブル分割)を検討する。
ブロック内連鎖
カラムを 256 個以上もつテーブルの場合も、1 行断片(レコードピース)に格納できない。 (Oracle 10g 時点の行断片の仕様)
しかし同一ブロックに次の行断片を格納できる十分な空き領域が存在すればブロック内行連鎖により同一データブロックに格納される。ブロック内行連鎖状態の場合には、ブロックI/Oによるロスは発生しないためレスポンスに大きな影響はない。
カラム数が非常に多いということは、データの伸張にともなって行移行を誘発しやすい。伸張したときに同一ブロックに格納できない場合には、複数データブロックに分かれて格納されるため全体の応答速度が徐々に、
そして確実に悪化していく OLTP 向けには極力控えた方が良い。
また、カラム数を 256 個以上もつテーブルは表の圧縮がサポートされていない。(Oracle 10g 時点)
ALTER TABLE 〜 MOVE COMPRESS を実行してもエラーにはならない。そしてディクショナリも圧縮済になるものの実際には圧縮されていない。
行連鎖 関連事項