IBM Support

[Db2] 表スペース解放のために効率的な再編成を行う方法

How To


Summary

表から不要なデータを削除しただけでは表のサイズは小さくなりません。表に割り当てられたエクステントを解放するために再編成を行う必要があります。
この Technote では、データベースに多数の表がある場合、どの表を優先的に再編成すべきかの判別方法を説明します。

Steps

以下の Technote に記述されているように、表スペースに割り当てられた領域を解放するには、まず表を再編成する必要があります。
再編成すべき表は REORGCHK コマンドの F2 および F3 に * がマークされているものを選択します。
例:すべてのユーザー表に対する REORGCHK を実行
 db2 connect to <db_name>
 db2 reorgchk on table user​
データベースに多数の表が含まれる場合、再編成すべき表を列挙するために、REORGCHK_TB_STATS プロシージャーと ADMINTABINFO 管理ビューが利用できます。
  1. 任意のエディターで以下のような reorg_sp.txt を作成します。
    create user temporary tablespace USERTEMP1@
    drop table session.reorgchk_results@
    drop procedure reorgchk()@
    create or replace procedure reorgchk()
    LANGUAGE SQL
    RESULT SETS 0
    BEGIN
    DECLARE table_check RESULT_SET_LOCATOR VARYING;
    
    DECLARE table_schema, table_name, datapartitionname VARCHAR(128);
    DECLARE cardinality, overflow, npages, fpages, active_blocks, tsize INTEGER;
    DECLARE f1, f2, f3, f4, f5, f6, f7, f8 INTEGER;
    DECLARE reorg CHAR(3);
    DECLARE got_all INTEGER DEFAULT 0;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET got_all = 1;
    
    DECLARE GLOBAL TEMPORARY TABLE session.reorgchk_results (
     table_schema VARCHAR(128),
     table_name VARCHAR(128),
     cardinality INTEGER,
     overflow INTEGER,
     npages INTEGER,
     fpages INTEGER,
     active_blocks INTEGER,
     tsize INTEGER,
     f1 INTEGER,
     f2 INTEGER,
     f3 INTEGER,
     reorg CHAR(3),
     reorg_recommended CHAR(1)
    ) ON COMMIT PRESERVE ROWS NOT LOGGED ON ROLLBACK PRESERVE ROWS;
    
    ​CALL sysproc.reorgchk_tb_stats('T', 'ALL');
    ASSOCIATE RESULT SET LOCATOR ( table_check )
    WITH PROCEDURE sysproc.reorgchk_tb_stats;
    ALLOCATE table_cursor CURSOR FOR RESULT SET table_check;
    
    SET got_all = 0;
    
    ​fetch_table: LOOP
     FETCH table_cursor
     INTO table_schema, table_name, datapartitionname, cardinality, overflow,
     npages, fpages, active_blocks, tsize, f1, f2, f3, reorg;
     IF got_all = 1 THEN
      LEAVE fetch_table;
     END IF;
    
    ​ INSERT INTO session.reorgchk_results
     (table_schema, table_name, cardinality, overflow, npages, 
      fpages, active_blocks, tsize, f1, f2, f3, reorg, reorg_recommended)
     VALUES 
     (table_schema, table_name, cardinality, overflow, npages, 
      fpages, active_blocks, tsize, f1, f2, f3, reorg,
      CASE WHEN reorg LIKE '%*%' THEN 'Y' ELSE 'N' END );
    END LOOP fetch_table;
    
    CLOSE table_cursor;
    END @
    
  2. データベースにデータベース管理者で接続し、reorg_sp.txt から reorgchk プロシージャーを作成します。
    db2 connect to <db_name>
    db2 -td@ -vf reorg_sp.txt
    
  3. 作成した reorgchk プロシージャーを実行し、session.reorgchk_results ユーザー一時表に結果を格納します。
    注:REORGCHK_TB_STATS プロシージャーは現在の統計情報をもとに再編成の必要性を報告します。
    より正確な結果を得るには reorgchk コマンドの update statistics または runstats コマンドで統計を更新してからプロシージャーを実行してください。
    db2 connect to <db_name>
    db2 call reorgchk
    
  4. 以下のような reorg_recommend.sql を作成します。この SQL は再編成が推奨される表を物理サイズの大きい順に 50 表リストします。
    SELECT 
     char(r.table_schema,30)table_schema, 
     char(r.table_name,30)table_name,
     t.data_object_p_size+t.index_object_p_size+t.lob_object_p_size as table_size_kb,
     case when t.lob_object_p_size > 0
     then 'Y' 
     else NULL
     end as LOB, 
     r.f2, 
     r.f3, 
     r.reorg 
    FROM 
     session.reorgchk_results  r join sysibmadm.admintabinfo t
    ON
     r.table_schema = t.tabschema and
     r.table_name = t.tabname
    WHERE
     f2 between 1 and 70 or f3 between 1 and 80 
    ORDER BY table_size_kb desc 
    FETCH FIRST 50 ROWS ONLY;
    
  5. reorg_recommend.sql を実行します。
    db2 connect to <db_name>
    db2 call reorgchk (接続してから reorgchk プロシージャーを実行していない場合)
    db2 -tvf reorg_recommend.sql
  6. (オプション) リストされた表を再編成するコマンドを生成するために以下のような reorg_gen.sql を作成します。
    SELECT 
     case when t.lob_object_p_size > 0
     then 
      'REORG TABLE ' ||
      TRIM(r.table_schema)||'.'|| 
      TRIM(r.table_name)||' LONGLOBDATA ;' 
     else
      'REORG TABLE ' ||
      TRIM(r.table_schema)||'.'|| 
      TRIM(r.table_name)||';'
     end 
    FROM 
     session.reorgchk_results  r join sysibmadm.admintabinfo t
    ON
     r.table_schema = t.tabschema and
     r.table_name = t.tabname
    WHERE
     f2 between 1 and 70 or f3 between 1 and 80 
    ORDER BY t.data_object_p_size+t.index_object_p_size+t.lob_object_p_size desc 
    FETCH FIRST 50 ROWS ONLY;
    
  7. (オプション) 生成されたコマンドで再編成を実行します。
    db2 connect to <db_name>
    db2 call reorgchk (接続してから reorgchk プロシージャーを実行していない場合)
    db2 -xtf reorg_gen.sql > reorg.db2
    db2 -tvf reorg.db2
    
お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと Db2 テクニカル・サポートへお問い合わせください。
Db2 テクニカル・サポート

Document Location

Worldwide

[{"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":"a8m500000008PlYAAU","label":"Database Objects-\u003ETables"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"10.1.0;10.5.0;11.1.0;11.5.0;9.7.0"}]

Document Information

Modified date:
15 August 2023

UID

ibm16457489