データベース内の全テーブルのサイズ(ディスク使用量)を取得するクエリー
データベース内の全テーブルのサイズ(ディスク使用量)を取得するには?
データベースサーバの空き容量が少なくなってきて、どのテーブルがディスク容量をたくさん使っているのかな?と調べたい時ありますよね。
ここでは、そんな時に使えるクエリーをご紹介します。
テーブルのサイズ(ディスク使用量)を取得するには
テーブルのサイズ(ディスク使用量)を簡単に取得するには sp_spaceused というシステム・ストアド・プロシジャーを使って確認することができます。
この sp_spaceused というストアド・プロシジャーは、パラメターを渡さなければデータベースのサイズを、テーブルなどのオブジェクト名を渡すと、そのオブジェクトのサイズ情報を返してくれます。
例えば、Person.Person テーブルのサイズを取得するクエリーは以下の通りです。 データベースを選択してから実行して下さい。
rows: テーブル内のレコード数
reserved: そのテーブル用にリザーブされている容量
data: そのテーブルのデータが使っているディスク容量
index_size: そのテーブルのインデックスが使っているディスク容量
unused: そのテーブル用にリザーブされているが、使われていない容量
(テーブル以外のオブジェクトも渡せます)
データベースのサイズを取得したい時は、データベースを指定して、sp_spaceused をパラメターなしで実行します。
database_size はデータベースのデータファイルとログファイルの合計サイズです。
データベース内の全テーブルのサイズ(ディスク使用量)を取得する
先ほどの sp_spaceused を使用して、データベース内で一番サイズ(ディスク使用量)が大きいテーブルを特定してみましょう。
データベース内の全テーブルのサイズを取得して、reserved のサイズが大きい順に並べるクエリーは以下の通りです。
- sp_spaceusedの結果を保存するテンポラリーテーブル #DiskUpsageByTables を作る。
- sp_MSforeachtable を使って sp_spaceused をデータベース内の全テーブルに対して実行し、その結果を #DiskUpsageByTables に保存する。
- #DiskUpsageByTables に保存されたデータを、 reserved の数字の部分の降順で結果を表示する。
name NVARCHAR(128),
rows CHAR(11),
reserved VARCHAR(18),
data VARCHAR(18),
index_size VARCHAR(18),
unused VARCHAR(18)
);
INSERT INTO #DiskUpsageByTables
EXEC sp_MSforeachtable 'sp_spaceused ''?''';
SELECT *
FROM #DiskUpsageByTables
ORDER BY CAST(REPLACE(reserved, ' KB', '') AS INT) DESC;
DROP TABLE #DiskUpsageByTables;
sp_MSforeachtable はドキュメントされていないシステムストアドプロシジャーで、? をデータベース内のテーブル名に置き換えて、全テーブル分実行してくれる便利なプロシジャーです。
ちなみに、SQL Server Management Studio からデータベースを選択して右クリックで Reports > Standard Reports > Disk Usage by Top Tables でも同じようなデータを取得することができます。