テーブルの容量取得


テーブルごとの領域一覧を取得するSQLは以下の通り

--テーブル変数の定義
DECLARE @TEMP_TABLE table(
row_id int IDENTITY(1,1) NOT NULL
,T_NAME varchar(128) NULL
,T_CNT bigint
,T_DATA bigint -- KBytes
,T_INDEX bigint -- KBytes
PRIMARY KEY (row_id)
)

--変数の定義
DECLARE @NAME nvarchar(128), @SQL nvarchar(256) 
DECLARE @CNT bigint, @DATA bigint, @INDEX bigint 
declare @row_id int


--カーソルの宣言
DECLARE csr_table CURSOR FOR

SELECT NAME FROM sysobjects where type='U' ORDER BY NAME


--カーソルのオープン
OPEN csr_table

FETCH NEXT FROM csr_table
INTO @NAME

WHILE @@FETCH_STATUS = 0
BEGIN
 --容量を取得し、テーブル変数へ
 SET @SQL = N'EXEC sp_MStablespace [' + @NAME + ']'
 INSERT INTO @TEMP_TABLE (T_CNT, T_DATA, T_INDEX)
 EXECUTE sp_executesql @SQL

 --テーブル名をセット
 SET @row_id = @@IDENTITY
 update @TEMP_TABLE SET T_NAME = @NAME WHERE row_id = @row_id

 FETCH NEXT FROM csr_table INTO @NAME

END

--カーソルクローズ
CLOSE csr_table
DEALLOCATE csr_table

--結果を返す
SELECT	T_NAME  as テーブル名, 
	T_CNT   as 件数, 
	T_DATA  as データ領域_KB, 
	T_INDEX as インデックス領域_KB, 
	(T_DATA+T_INDEX) / 1024 AS 合計_MB,
	(
	select	sum(sys.columns.max_length) as Row_Size_byte
	From	sys.tables
	left join sys.columns on sys.tables.object_id = sys.columns.object_id
	where	sys.tables.name  = T_NAME
	) as レコードサイズ_Byte
FROM @TEMP_TABLE 
ORDER BY T_NAME  


動作確認環境:SQL Server 2008