Oracle の表領域の使用量と空き容量を知る方法について、OEMDC(Oracle Enterprise Manager Database Console)や SI Object Browser などのツールを使って確認するのは容易ですが、SQL*Plus で確認する方法がわからないのことが多いので、その方法のメモ。
まず大前提として「表領域の現在容量や空き容量という情報はない」です。あるのは「表領域に属する "データファイル" のサイズと空き容量」です。
さらにはデータファイルについても「現在使用量」という情報はないです。データファイルの現在使用量はデータファイルのサイズから空き容量を差し引いて求めます。
それを踏まえたうえで、例えば USERS 表領域の使用量を求めるには以下のように求めます。
- USERS 表領域に属するデータファイルごとのサイズを表示します。
select FILE_ID, BYTES, FILE_NAME from DBA_DATA_FILES where TABLESPACE_NAME='USERS';
- USERS 表領域に属するデータファイルごとの空き領域を表示します。
select FILE_ID, BYTES from DBA_FREE_SPACE where TABLESPACE_NAME='USERS';
- これらの合計の差が使用量になりますが、ファイル毎に表示されて面倒なのと、単位が Byte で桁が無駄に多いので、集計して MB で表示します。
select sum(BYTES) / (1024*1024) from DBA_DATA_FILES where TABLESPACE_NAME='USERS'; --① select sum(BYTES) / (1024*1024) from DBA_FREE_SPACE where TABLESPACE_NAME='USERS'; --②
- 上記で出た数値を差し引けば(①-②)、現在の使用量が求められます。
表領域ごとに使用量と使用率の一覧が出る…みたいな SQL が欲しい場合は、上記をヒントに自分で作るか、他の色んなサイトで紹介されているのでそちらをどうぞ(汗
また余談ですが、上記のように迂遠な方法を使わずとも、以下の view を用いて表示する方法もあります。
select * from DBA_TABLESPACE_USAGE_METRICS where TABLESPACE_NAME='USERS';
これの注意点としては、表示される数値はブロック数(ブロックサイズは show parameter db_block_size で参照)でありバイトではない点と、AUTOEXTEND ON を指定している場合は、現在のデータベースファイルのサイズではなく、理論上の最大(ディスク容量またはデータベースファイルの最大拡張サイズ)が表示される点です。特性を理解したうえで使い分けてください。