IBM Support

[DB2 LUW] 表スペース・コンテナーに確保された領域を解放する方法

Question/Answer


Question

DELETE ステートメントで表のデータを削除しましたが、表スペースのサイズが小さくなりません。 どうしたら表スペースのサイズを縮小できますか?

Cause

DB2 は、表や索引などのオブジェクトをエクステント単位で表スペースに格納します。
表に格納されている行を削除した場合、まず再編成によって空きエクステントをオブジェクトから解放する必要があります。
再編成しない場合、削除によって発生した空きエクステントは、元のオブジェクトによって再利用されます。

SMS 表スペースの場合は、オブジェクトごとにコンテナが割り当てられているため、再編成のみで表スペースのサイズを小さくできます。
DMS 表スペースの場合は、再編成しても表スペースに空きエクステントが増えるだけで、表スペースのサイズ自体は小さくなりません。

このため、SMS 表スペースは以下の Step 1 のみで表スペースのサイズを小さくできますが、自動ストレージ表スペースを含む DMS 表スペースはさらに Step 2 でエクステントを OS に解放する必要があります。

Answer

Step 1: オブジェクトからエクステントを解放

表からデータを削除しても表のサイズは小さくなりません。表や索引、LOB などのオブジェクトからエクステントを解放するには再編成を行う必要があります。
再編成するには、以下のように再編成したい表名を指定して REORG コマンドを実行します。

db2 connect to <データベース名>
db2 reorg table <表名>

注1: デフォルトで LONG データおよび LOB データは再編成されません。空きの多くなった LOB データを小さくしたい場合は LONGLOBDATA オプションをつけて REORG コマンドを実行する必要があります。
ただし、LOB データを再編成すると LOB 列の更新パフォーマンスが著しく低下する可能性があります。
注2: V10.5 以降で利用可能なカラム・オーガナイズ表からエクステントを解放するには、再編成に RECLAIM EXTENTS オプションを付与する必要があります。

表や索引などのオブジェクトが確保しているエクステントに、どの程度の実データが存在するかは、INSPECT コマンドで確認できます。
Total Pages と Free Space が大きい表を再編成することで、効率的にエクステントを解放できます。

例: 表スペース TS1 に含まれるすべてのオブジェクトの使用率を調べる

db2 connect to <データベース名>
db2 inspect check tablespace name TS1 results keep inspect_TS1.out
db2inspf 
    
     /inspect_TS1.out inspect_TS1.fmt
cat inspect_TS1.fmt

    Table phase start (ID Signed: 4, Unsigned: 4; Tablespace ID: 2) :
     
      Data phase start. Object: 4  Tablespace: 2
       Traversing DAT extent map, anchor 96.
       Extent map traversal complete.
       DAT Object Summary: Total Pages 5212 - Used Pages 5210 - Free Space 70 %
      Data phase end.
    Table phase end.

    

上の例では表スペース ID 2、表 ID 4 の表を再編成すると、3600 ページ程度解放できると見積もれます。
表スペース ID 2、表 ID 4 の表名は以下の SQL で表示できます。

db2 connect to <データベース名>
db2 select tabschema, tabname from syscat.tables where tbspaceid=2 and tableid=4

Step 2: (DMS のみ) 表スペースからエクステントを解放

V9.7 以降に新規作成された表スペースで「再利用可能ストレージ」が有効な場合、ALTER TABLESPACE ステートメントで未使用の領域を解放できます。
再利用可能ストレージが有効でない場合、表スペースの最高水準点を下げる操作を行った後、ALTER TABLESPACE ステートメントで未使用の領域を解放できます。

再利用可能ストレージかどうかは、MON_GET_TABLESPACE 表関数で判別できます。
以下の例では SYSCATSPACE と USERSPACE1 で再利用可能ストレージが有効になっています。

db2 "select char(TBSP_NAME,12)TBSP_NAME, TBSP_ID, TBSP_TYPE, TBSP_USING_AUTO_STORAGE, RECLAIMABLE_SPACE_ENABLED from table(MON_GET_TABLESPACE(null, null)) as t"

TBSP_NAME    TBSP_ID   TBSP_TYPE TBSP_USING_AUTO_STORAGE RECLAIMABLE_SPACE_ENABLED
------------ --------- --------- ----------------------- -------------------------
SYSCATSPACE          0 DMS                             1                         1
TEMPSPACE1           1 SMS                             1                         0
USERSPACE1           2 DMS                             1                         1

V9.5 以前は再利用可能ストレージが使えないため、SNAPTBSP 管理ビューなどを使って、対象の表スペースが自動ストレージかどうかを判別します。

db2 "select char(TBSP_NAME,12)TBSP_NAME, TBSP_ID, TBSP_TYPE, TBSP_USING_AUTO_STORAGE from SYSIBMADM.SNAPTBSP"

TBSP_NAME    TBSP_ID   TBSP_TYPE TBSP_USING_AUTO_STORAGE
------------ --------- --------- -----------------------
SYSCATSPACE          0 DMS                             1
TEMPSPACE1           1 SMS                             1
USERSPACE1           2 DMS                             1

a) 再利用可能ストレージが有効な DMS 自動ストレージ表スペースの場合

次のいずれかのオプションを選択できます。

  • ALTER TABLESPACE の REDUCE オプション
    削除ペンディングのエクステントが削除されます。
    例:
    ALTER TABLESPACE TS1 REDUCE
  • ALTER TABLESPACE の REDUCE オプション (サイズ指定)
    削除ペンディングのエクステントが削除され、エクステントの移動によって指定量のサイズが削減されます。
    例:
    ALTER TABLESPACE TS1 REDUCE 10 PERCENT
  • ALTER TABLESPACE の REDUCE MAX オプション
    可能な限り多くのエクステントを移動して表スペースのサイズが削減されます。
    例:
    ALTER TABLESPACE TS1 REDUCE MAX

注:ALTER TABLE の REDUCE xxx オプションは表スペースのエクステントを移動するため、表スペースが大きい場合は非常に長い時間を要する可能性があります。エクステント移動の進行状況は、MON_GET_EXTENT_MOVEMENT_STATUS 表関数を使用してモニターできます。
例:

$ db2 connect to <データベース名>
$ db2 "select * from table(SYSPROC.MON_GET_EXTENT_MOVEMENT_STATUS('', -1))"

エクステント移動の詳細動作は再利用可能ストレージを参照してください。


b) 再利用可能ストレージが有効な (自動ストレージでない) DMS 表スペースの場合

2 つの ALTER TABLESPACE ステートメントによって表スペースのサイズを削減できます。

  1. まず ALTER TABLESPACE の LOWER HIGH WATER MARK オプションで表スペースの最高水準点を引き下げます。
    ALTER TABLESPACE TS1 LOWER HIGH WATER MARK
  2. 次に ALTER TABLESPACE ステートメントの REDUCE オプションで最高水準点 (+α) まで表スペースを小さくします。
    ALTER TABLESPACE TS1 REDUCE (FILE 'TS1' <size>)


c) 再利用可能ストレージが有効でない DMS 自動ストレージ表スペースの場合 (この手法は V9.1 以前では使えません)
(重要) 最高水準点は、あらかじめ「運用上の考慮点」を参照して手作業で下げる必要があります。

  • ALTER TABLESPACE の REDUCE オプション
    削除ペンディングのエクステントを削除し、さらに最高水準点まで表スペースのサイズを小さくします。
    例:
    ALTER TABLESPACE TS1 REDUCE

 

d) 再利用可能ストレージが有効でない (自動ストレージでもない) DMS 表スペースの場合
(重要) 最高水準点は、あらかじめ「運用上の考慮点」を参照して手作業で下げる必要があります。

  • ALTER TABLESPACE の REDUCE オプション
    削減する量を指定します。最高水準点まで表スペースのサイズを小さくできます。
    例:
    ALTER TABLESPACE TS1 REDUCE (FILE 'TS1' <size>)
  • ALTER TABLESPACE の RESIZE オプション
    削減後のサイズを指定します。最高水準点まで表スペースのサイズを小さくできます。
    例:
    ALTER TABLESPACE TS1 RESIZE (FILE 'TS1' <size>)


運用上の考慮点

  • 最高水準点を下げる方法

    再利用可能ストレージが有効でない表スペースには、直接最高水準点を下げるオプションがありません。
    表や索引の再編成、EXPORT/DROP/IMPORT を組み合わせて、手作業で最高水準点を下げる必要があります。

    手作業で最高水準点を下げるための指示は db2dart <データベース名> /lhwm コマンドによって得られます。
    db2dart コマンドが生成するレポートファイルの指示に従って、表や索引を操作してください。
    最高水準点に配置されたエクステントをもつオブジェクトを操作しないと最高水準点は変化しないので、db2dart コマンドの指示に従わないと最高水準点は下がりません。

    以下に db2dart コマンドを利用した最高水準点の下げ方の例を示します。
     
    1. 表スペースの最高水準点 (High water mark) と空きページ数を調べます。
      以下の表スペース ID 4 の TS1 は、最高水準点は 736 ですが、416 ページしか使っていないことがわかります。
      $ db2 connect to <データベース名>
      $ db2 list tablespaces show detail
      
       Tablespace ID                        = 4
       Name                                 = TS1
       Type                                 = Database managed space
       Contents                             = All permanent data. Large table space.
       State                                = 0x0000
         Detailed explanation:
           Normal
       Total pages                          = 4000
       Useable pages                        = 3968
       Used pages                           = 416
       Free pages                           = 3552
       High water mark (pages)              = 736
      
    2. データベースをオフラインにし、db2dart /lhwm でレポートファイルを作成します。
      以下の例では、表スペース ID 4 の最高水準点を 500 ページ以下にするための指示を入手しています。
      $ db2 terminate
      DB20000I  The TERMINATE command completed successfully.
      $ db2dart <データベース名> /lhwm
      
      Please enter tablespace ID, and number of pages (desired highwater mark):
      4,500
      
               The requested DB2DART processing has completed successfully!
                              Complete DB2DART report found in:
      /home/db2inst1/sqllib/db2dump/DART0000/SAMPLE.RPT
      
    3. レポートファイルを開き、指示を確認します。
      以下の例は、オブジェクト ID 5 を USE および LONGLOBDATA オプションを使わずにオフライン再編成することを指示しています。
      Step #1:  Object ID = 5
      
       => Offline REORG of this table (do not specify a temporary tablespace
          and do not use the LONGLOBDATA option).
      
          Table: DB2INST1.T1
      
      ** Run the suggested offline REORG for the table first, and then run LHWM
         for the suggestion on other objects.
      
    4. 指示に従ってオブジェクトを操作します。
      上記のレポートの例では再編成を行います。
      $ db2 connect to <データベース名> 
      $ db2 reorg table DB2INST1.T1
    5. (重要) 期待される最高水準点に下がるまで 2 から 4 の手順を繰り返します。
       
  • 削除ペンディングのエクステント

    最高水準点にあるエクステントをオブジェクトが解放した場合、表スペース統計はすぐに更新されず、削除ペンディングのエクステントとして扱われます。
    LIST TABLESPACES SHOW DETAIL コマンドや ALTER TABLESPACE の REDUCE オプションを使うと、削除ペンディングのエクステントが即時に解放され、正確な最高水準点が得られます。
    削除ペンディングのエクステントによるページの合計は db2pd -alldbs -tablespaces コマンドの PndFreePgs 列に表示されます。
     
  • 再利用可能ストレージへの変換

    再利用可能ストレージが有効でない表スペースは、再利用可能ストレージに変換できません。
     

関連情報
[DB2 LUW] パスポート・アドバンテージによく寄せられる質問
V10.5 カラム・オーガナイズ表のスペース再利用
V9.7 新機能: 表スペースの未使用スペースの再利用がサポートされるようになった
reclaimable_space_enabled - 再利用可能なスペースが有効な標識 : モニター・エレメント
ALTER TABLESPACE ステートメント

お問合せ先
技術的な内容に関して、サービス契約のもと IBM サービス・ラインにお問い合わせください。
IBM サービス・ライン

Document information

More support for: DB2 for Linux, UNIX and Windows

Component: OTHER - Uncategorised

Software version: 9.1, 9.5, 9.7, 10.1, 10.5, 11.1

Operating system(s): AIX, HP-UX, Linux, Solaris, Windows

Reference #: 1575040

Modified date: 21 November 2018