データベース内の全テーブルのサイズ(ディスク使用量)を取得するクエリー

データベース内の全テーブルのサイズ(ディスク使用量)を取得するには?

データベースサーバの空き容量が少なくなってきて、どのテーブルがディスク容量をたくさん使っているのかな?と調べたい時ありますよね。

ここでは、そんな時に使えるクエリーをご紹介します。

テーブルのサイズ(ディスク使用量)を取得するには

テーブルのサイズ(ディスク使用量)を簡単に取得するには sp_spaceused というシステム・ストアド・プロシジャーを使って確認することができます。

この sp_spaceused というストアド・プロシジャーは、パラメターを渡さなければデータベースのサイズを、テーブルなどのオブジェクト名を渡すと、そのオブジェクトのサイズ情報を返してくれます。


例えば、Person.Person テーブルのサイズを取得するクエリーは以下の通りです。 データベースを選択してから実行して下さい。

EXEC sp_spaceused Person.Person;

テーブルのサイズを取得するクエリーの実行結果

rows: テーブル内のレコード数
reserved: そのテーブル用にリザーブされている容量
data: そのテーブルのデータが使っているディスク容量
index_size: そのテーブルのインデックスが使っているディスク容量
unused: そのテーブル用にリザーブされているが、使われていない容量
(テーブル以外のオブジェクトも渡せます)


データベースのサイズを取得したい時は、データベースを指定して、sp_spaceused をパラメターなしで実行します。

EXEC sp_spaceused;

データベースのサイズを取得するクエリーの実行結果

database_size はデータベースのデータファイルとログファイルの合計サイズです。

データベース内の全テーブルのサイズ(ディスク使用量)を取得する

先ほどの sp_spaceused を使用して、データベース内で一番サイズ(ディスク使用量)が大きいテーブルを特定してみましょう。

データベース内の全テーブルのサイズを取得して、reserved のサイズが大きい順に並べるクエリーは以下の通りです。

  1. sp_spaceusedの結果を保存するテンポラリーテーブル #DiskUpsageByTables を作る。
  2. sp_MSforeachtable を使って sp_spaceused をデータベース内の全テーブルに対して実行し、その結果を #DiskUpsageByTables に保存する。
  3. #DiskUpsageByTables に保存されたデータを、 reserved の数字の部分の降順で結果を表示する。

CREATE TABLE #DiskUpsageByTables (
     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 でも同じようなデータを取得することができます。

Disk Usage by Top Tables レポート

© 2010-2024 SQL Server 入門