IBM Support

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

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 オプションを付与する必要があります。
  • 注3: オフライン再編成には追加のスペースが必要です。空きスペースがない場合はオンライン再編成の使用を検討してください。
    [Db2] 再編成実行時に利用される表スペース
    ただし、オンライン再編成はオフライン再編成の数倍の時間を要する可能性があります。
  • 注4: どの表を再編成すると効率的にスペースを解放できるかを確認するには以下のページを参照してください。
    [Db2] 表スペース解放のために効率的な再編成を行う方法


表や索引などのオブジェクトが確保しているエクステントに、どの程度の実データが存在するかは、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

注:オブジェクトがパーティション表のパーティションの場合、所属するパーティション表は以下の SQL で表示できます。

db2 select tabschema, tabname from syscat.datapartitions where tbspaceid=2 and partitionobjectid=4

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

V9.7 以降に新規作成された表スペースで「再利用可能ストレージ (RSE)」が有効な場合、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) 再利用可能ストレージが有効 (RECLAIMABLE_SPACE_ENABLED=1) な DMS 自動ストレージ表スペースの場合

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

  • ALTER TABLESPACE の REDUCE オプション
    削除ペンディングのエクステントが削除されます。
    例:
    ALTER TABLESPACE <表スペース名> REDUCE
  • ALTER TABLESPACE の REDUCE オプション (サイズ指定)
    削除ペンディングのエクステントが削除され、エクステントの移動によって指定量のサイズが削減されます。
    例:
    ALTER TABLESPACE <表スペース名> REDUCE 10 PERCENT
  • ALTER TABLESPACE の REDUCE MAX オプション
    可能な限り多くのエクステントを移動して表スペースのサイズが削減されます。
    例:
    ALTER TABLESPACE <表スペース名> REDUCE MAX
    注:ALTER TABLE の REDUCE xxx オプションは表スペースのエクステントを移動します。エクステント移動はオンライン操作のため、DDL や DML と競合しませんが、I/O により並行して実行されるトランザクションのパフォーマンスに影響する可能性があります。このため運用時間帯を避けての実行を推奨します。エクステント移動の停止方法、モニター方法および考慮点は以下のページをご参照ください。
    [Db2] ALTER TABLESPACE によるエクステント移動の開始、停止およびモニター方法
    また、エクステント移動の詳細動作は再利用可能ストレージを参照してください。


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

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

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


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

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

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

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


運用上の考慮点

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

    再利用可能ストレージが有効でない表スペースには、直接最高水準点を下げるオプションがありません。
    表や索引の再編成、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 列に表示されます。
     
  • 再利用可能ストレージへの変換
    再利用可能ストレージが有効でない表スペースは、再利用可能ストレージに変換できません。
     
  • pureScale システムの制限事項
    pureScale システムの表スペースは、すべて再利用可能ストレージが有効な DMS 自動ストレージで構成されています。
    しかし、pureScale ではエクステントの移動がサポートされておらず、ALTER TABLESPACE の REDUCE や LOWER HIGH WATER MARK は SQL1419N rc=11 で失敗します。
    Db2 v11.1m4fp4 以降、明示的にエクステントの移動を有効化することで、ALTER TABLESPACE が実行可能になります。
    詳細は以下の Technote を参照してください。
    Extent movement availability in IBM® Db2® pureScale®
     

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

お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと Db2 テクニカル・サポートへお問い合わせください。
Db2 テクニカル・サポート

[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008PlMAAU","label":"Data Movement-\u003EReorg"},{"code":"a8m500000008PlYAAU","label":"Database Objects-\u003ETables"},{"code":"a8m500000008PlZAAU","label":"Database Objects-\u003ETablespaces"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"All Versions"}]

Document Information

Modified date:
30 January 2024

UID

swg21575040