データベース備忘録

※自分調べ

行移行、行連鎖…

適当に調べて適当にまとめたのでこの記事を見たという、数少ない人は指摘があればコメントしていただけるとありがたいです。

 

行移行、行連鎖…

DB性能劣化の原因である断片化、その要因の主な2つ(ほんとはブロック内連鎖とかもあるらしいが)

 

断片化の種類についてもまとめようと色々調べていたが、以下のリンクに解消方法とともに分かりやすくまとめられていた

blogs.oracle.com

 

 

 

 

本題の行移行と行連鎖

最初調べたとき、1レコードが複数のデータブロックにまたがっちゃうという点では「どっちも同じじゃん」と思っていたが良く調べてみたら違った。

 

 

◆行移行

更新などで1レコードのデータ量が増加、初めに入っていたデータブロック(ブロックA)では収まりきらない、だから別の空きブロック(ブロックB)に移行しよう!で発生する

この際に後から更新したデータのみがブロックBに格納されるわけではなく、既存のデータも一緒にブロックBに移行される。

 

じゃあ既存のデータが入っていたブロックAの領域には何が残るの?って疑問が出てくるが、ブロックAにはブロックBに実データが格納されているよ、というポインタを残す。

行移行は完全な移行ではないので、ROWIDは変更されない

つまり、行移行をしたレコードを検索する際にインデックスを使って検索したとて、初めにブロックAを検索してからブロックBを見に行くので効率が悪い。

 

 

 

◆行連鎖

ドでかいデータを挿入する際に発生する。

一つのデータブロックでは収まりきらないレコードがある場合に、致し方なしということで複数のデータブロックにデータを分割して格納する。

 

行連鎖というか行分割ではないのか?と思ったが、

ブロックAにはブロックBのポインタが、ブロックBにはブロックCのポインタが、ブロックCには…とった感じでブロック同士が一方向に連鎖してデータを格納するから「行連鎖」らしい

 

 

 

行連鎖は結構分かりやすいと思う、「一つの箱では買ってきた物が収まりきらないから複数の箱に分割してしまおう」のイメージ

行移行は初め行連鎖と同じだと思っていたが「物を増やしたら箱に収まらないから、元の箱にメモを残しておいて別の箱に移しちゃおう」のイメージだった。