SYSIBMADM.ADMINTABINFO

各サイズを"kb"単位で出力してくれる。精度も高いらしい。ちなみに"P_SIZE"なのでページ・サイズかなと思ったのですが、"physical size"の略でした。

SELECT
    TABSCHEMA,
    TABNAME,
    SUM(DATA_OBJECT_P_SIZE),
    SUM(INDEX_OBJECT_P_SIZE),
    SUM(LONG_OBJECT_P_SIZE),
    SUM(LOB_OBJECT_P_SIZE),
    SUM(XML_OBJECT_P_SIZE)
FROM
    SYSIBMADM.ADMINTABINFO
GROUP BY
    TABSCHEMA,
    TABNAME

※REORGを実施していないと大量データのロールバックなどの影響で、データ量が断片化され想定以上に増えていることがある。

手間だから表領域単位で容量取得

DB2の公式ページ「簡単!DB2の設計: 2.データベース、表スペース、表の作成」によると表領域単位で容量制限があるらしい。上記SQLをちょっと修正して、表領域単位で容量を取得する。

SELECT
  SYSIBMADM.ADMINTABINFO.TABSCHEMA
  , SYSCAT.TABLES.TBSPACE
  , SUM(DATA_OBJECT_P_SIZE) as DATA_OBJECT_P_SIZE
  , SUM(INDEX_OBJECT_P_SIZE) as INDEX_OBJECT_P_SIZE
  , SUM(LONG_OBJECT_P_SIZE) as LONG_OBJECT_P_SIZE
  , SUM(LOB_OBJECT_P_SIZE) as LOB_OBJECT_P_SIZE
  , SUM(XML_OBJECT_P_SIZE) as XML_OBJECT_P_SIZE 
FROM
  SYSIBMADM.ADMINTABINFO 
  inner join SYSCAT.TABLES 
    on SYSIBMADM.ADMINTABINFO.TABNAME = SYSCAT.TABLES.TABNAME 
GROUP BY
  SYSIBMADM.ADMINTABINFO.TABSCHEMA
  , SYSCAT.TABLES.TBSPACE; 

もしかしたらエクステントなどで若干差異が出るかもしれないが、あまり気にしないことにする。。

表領域のタイプは、SYSCAT.TABLESPACES.DATATYPEで確認しよう。

select * from SYSCAT.TABLESPACES

INSPECT コマンド

INSPECT CHECKを使うと実際のデータから容量を解析してくれる。文句なしの一番確実な方法でオンライン中でも検査が可能だが、実行時間が長くパフォーマンスに影響を与えるため、アクセス時間が少ない時や、別環境にリストアして実行するのがお薦め。

表領域が対象の場合

db2 INSPECT CHECK TABLESPACE NAME ${表スペース名} RESULTS KEEP ${出力ファイル名}

表が対象の場合

db2 INSPECT CHECK TABLE NAME ${表スペース名} RESULTS KEEP ${出力ファイル名}

INSPECT CHECK実行後、データをフォーマットする必要がある。

db2inspf ${出力ファイル名} ${ファイル名}

オブジェクト単位でページ数がわかる。表ID、表領域IDは、syscat.tables、syscat.tablespacesから確認する。

select tabschema, tabname from syscat.tables
select tabschema, tabname from syscat.tablespaces