web-dev-qa-db-ja.com

DELETE + REORGでディスクスペース(DB2)が解放されないのはなぜですか?

DB2には、大きなバイナリデータを含むテーブルがあります。今、私はテーブル全体をパージして、runstats、reorg、runstatsを実行しましたが、ディスク容量の量は変わりません。ここで何が悪いのでしょうか?

テーブルは、次のように作成した独自のテーブルスペースにあります。

CREATE BUFFERPOOL "MY_BP" SIZE 250 AUTOMATIC PAGESIZE 4096;
CREATE LARGE TABLESPACE MY_TBS IN DATABASE PARTITION GROUP IBMDEFAULTGROUP PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE EXTENTSIZE 64 PREFETCHSIZE 64 BUFFERPOOL MY_BP OVERHEAD 10.500000 TRANSFERRATE 0.140000 FILE SYSTEM CACHING;

次のように削除/再編成しました:

DELETE FROM MY_TBL
RUNSTATS ON TABLE MY_TBL WITH DISTRIBUTION AND DETAILED INDEXES ALL
REORG TABLE MY_TBL
RUNSTATS ON TABLE MY_TABLE WITH DISTRIBUTION AND DETAILED INDEXES ALL
ALTER TABLESPACE MY_TBS REDUCE

テーブルMY_TBLはそれよりも前に2.5 GBを消費し、削除/再編成後は3つしか使用しません[〜#〜] mb [〜#〜]少ない。

FWIW:私はDB2/NT v9.5.2を実行しています。

テーブル MY_TBLは、BLOB列に大きなバイナリデータを含みます。 REORGコマンドのドキュメントでは、DB2は時間がかかり、クラスタリングが改善されないため、そのようなオブジェクトの再編成を回避すると述べています。ただし、LONGLOBDATAオプションが指定されている場合、DB2はLOBデータの再編成を強制できます。未使用のスペースはDB2で再利用できるため、新しいデータを挿入すると、既存の未使用のページが埋められてから、新しいページが割り当てられます。

ランニング

REORG TABLE MY_TBL LONGLOBDATA

空のテーブルが使用していた2.5GBのディスク領域を正常に再利用しました。

私はこのオプションについて知らなかったし、ドキュメントを初めて読んだときにそれを監督しました。

自動ストレージを使用していると思います。 (これが他の場合に発生する可能性があるわけではありません...これは自動ストレージで発生するのは簡単です。)

問題は、データベースがそれ自体のスペースを再利用したが、ディスクを解放してオペレーティングシステムに戻さなかった可能性が高いです。これは、テーブルスペースのハイウォータマークをチェックすることで非常に簡単に表示できます。

次のようにします

_db2 list tablespaces show detail_

これにより、各テーブルスペースとディスク上で使用されているものが表示されます。 _Used pages_は、データベースが使用しているディスクのページ数です。これを_total pages_(ディスク上で要求された合計)およびHigh water mark (pages)と比較すると、実際に必要以上に「要求」していることがわかります。 (つまり、使用率の低いページ、非常に高い合計ページ、および合計ページに近い最高水準点)。

この未使用のスペースを削除してオペレーティングシステムに戻すには、(自動ストレージで)_db2 alter tablespace <tablespace name> reduce max_を発行します。例

_db2 alter tablespace ts1 reduce max;
_

これにより、DB2は最高水準点を下げ、未使用のディスクを解放してオペレーティングシステムに戻します。 (これは、システムの一時テーブルスペースまたはユーザー一時テーブルスペースではなく、通常の大きなテーブルスペースに対してのみ実行できます)。

自動ストレージなしでDMSを使用している場合は、少し異なるコマンドセットを使用する必要があります。

_db2 alter tablespace <tablespace name> lower high water mark;
db2 alter tablespace reduce (<containter name> or [all containers] integer K|M|G or integer PERCENT);
_

_db2 alter tablespace ts1 lower high water mark;
db2 alter tablespace reduce (all containers 500 M);
_

作業する場所では、これをメンテナンススクリプトの一部に入れて、再編成した後に自動的にこれを実行して、ディスク領域を確実に再利用できるようにします。私たちのケースでは、DB2 LUW 9.7 FP 4を使用しているため、9.5のインフォメーションセンターを再確認して、バージョンに適した情報にアクセスできることを確認しても問題ありません。

編集:テーブルスペースがDB2 9.7にアップグレードされたデータベースからのものである場合、おそらく再利用可能なストレージ属性が設定されていません。これは、DMSから自動ストレージにアップグレードする場合にも当てはまります。ハイウォーターマークを実際に下げることはできないため、どちらの方法でもかみます。テーブルとデータをダンプし、テーブルスペースを削除する必要があります。次に、自動ストレージを使用してテーブルスペースを再作成し、テーブルのデータをインポートします。

22
Chris Aldrich