To identify which table is taking up the most physical storage space in the database, you may run the following SQL query to return the number of rows and physical sizes of each user defined table in the database.
DECLARE @TableSchema VARCHAR(128)
DECLARE @TableName VARCHAR(128)
DECLARE @TableFullName VARCHAR(256)
-- declare a cursor to get all user table names
DECLARE t_csr CURSOR
FOR
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
FOR READ ONLY
-- a temp table to store the results
CREATE TABLE #TMP
(
SchemaName varchar(128),
TableName varchar(128),
RecordCount int,
ReservedSize varchar(50),
DataSize varchar(50),
IndexSize varchar(50),
UnusedSize varchar(50)
)
DECLARE @MTMP TABLE
(
TableFullName varchar(256),
RecordCount int,
ReservedSize varchar(50),
DataSize varchar(50),
IndexSize varchar(50),
UnusedSize varchar(50)
)
-- open the cursor
OPEN t_csr
-- get the first table name from the cursor
FETCH NEXT FROM t_csr INTO @TableSchema, @TableName
-- loop until the cursor was not able to fetch
WHILE (@@Fetch_Status >= 0)
BEGIN
SET @TableFullName = @TableSchema + '.' + @TableName
-- dump the results of the sp_spaceused query to the temp table
INSERT @MTMP
EXEC sp_spaceused @TableFullName
INSERT #TMP
SELECT @TableSchema,
TableFullName,
RecordCount,
ReservedSize,
DataSize,
IndexSize,
UnusedSize
FROM @MTMP
DELETE FROM @MTMP
-- get the next table name
FETCH NEXT FROM t_csr INTO @TableSchema, @TableName
END
-- dispose the cursor
CLOSE t_csr
DEALLOCATE t_csr
-- return the stored results by table DataSize
SELECT *
FROM #TMP
ORDER BY CAST(LEFT(DataSize,LEN(DataSize)-3) AS NUMERIC(18,0)) DESC
-- clean up
DROP TABLE #TMP