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