はじめに
世間ではDb2がリリースされて30年経ちますが、まだまだ私自身の知識や理解が追いついていない所となります。。。
テーブルのレコードを削除したのに何故、物理ストレージやテーブルスペースが減らないんだろう?という事があったため物理ストレージ、テーブルスペース、テーブルサイズについて記事にしたいと思います。
概要について
それぞれの領域の簡単な概要については以下の通りとなります。
物理ストレージ:DBの様々なデータ(テーブルスペース)群が格納される一番大枠となる領域。
テーブルスペース(表領域):DBのシステムやデータをまとめて保管する領域。
テーブル:データ(レコード)を格納する領域。
イメージ図
物理ストレージ、テーブルスペース、テーブルのイメージとしては以下のようになります。
データを削除した際の挙動について
テーブルのレコードを削除した際の各領域の変化についてまとめていきます。
以下のイメージではテーブルCとテーブルFのレコードをdeleteコマンドにより削除したイメージとなります。
deleteコマンドによりレコードを削除した場合は論理削除となり、物理的にはレコードまだ残っている状態となります。
(つまりテーブルとしては削除前のレコードも持った状態となります。)
そのため、delete後にselect countコマンドによるレコード件数結果が減ったように見えてもテーブルサイズは変わらないのは、論理削除レコードが残っているからとなります。
論理削除レコード削除してテーブルサイズを小さくするためにはreorgコマンドによるテーブルの再編成をすることで論理削除レコードを解放し、テーブルサイズを縮小することができます。
reorgによりテーブルサイズが小さくなったので、テーブルスペースや物理ストレージが合わせて小さくなるかというと、ならないようです。
以下のイメージ図のようにテーブルサイズが小さくなってもそのスペースはテーブルスペース内のフリースペースとして再利用されます。
テーブルスペース、物理ストレージも併せて縮小したい場合はalter tablespaceコマンドで縮小できます。
なので、テーブルのレコードをdeleteしただけではテーブルのサイズも変割らない為、
目的に応じてdeleteコマンドで削除した後は、reorgやalter tablespaceコマンドで使われなくなった領域を解放してあげる必要があります。