How to: Check which table is the biggest, in SQL Server
Posted
by AngelEyes
on Geeks with Blogs
See other posts from Geeks with Blogs
or by AngelEyes
Published on Wed, 07 Apr 2010 15:53:23 GMT
Indexed on
2010/04/07
15:03 UTC
Read the original article
Hit count: 853
The company I work with had it's DB double its size lately, so I needed to find out which tables were the biggest.
I found this on the web, and decided it's worth remembering!
Taken from http://www.sqlteam.com/article/finding-the-biggest-tables-in-a-database, the code is from http://www.sqlteam.com/downloads/BigTables.sql
/**************************************************************************************
*
* BigTables.sql
* Bill Graziano (SQLTeam.com)
* [email protected]
* v1.1
*
**************************************************************************************/
DECLARE @id INT
DECLARE @type CHARACTER(2)
DECLARE @pages INT
DECLARE @dbname SYSNAME
DECLARE @dbsize DEC(15, 0)
DECLARE @bytesperpage DEC(15, 0)
DECLARE @pagesperMB DEC(15, 0)
CREATE TABLE #spt_space
(
objid INT NULL,
ROWS INT NULL,
reserved DEC(15) NULL,
data DEC(15) NULL,
indexp DEC(15) NULL,
unused DEC(15) NULL
)
SET nocount ON
-- Create a cursor to loop through the user tables
DECLARE c_tables CURSOR FOR
SELECT id
FROM sysobjects
WHERE xtype = 'U'
OPEN c_tables
FETCH NEXT FROM c_tables INTO @id
WHILE @@FETCH_STATUS = 0
BEGIN
/* Code from sp_spaceused */
INSERT INTO #spt_space
(objid,
reserved)
SELECT objid = @id,
SUM(reserved)
FROM sysindexes
WHERE indid IN ( 0, 1, 255 )
AND id = @id
SELECT @pages = SUM(dpages)
FROM sysindexes
WHERE indid < 2
AND id = @id
SELECT @pages = @pages + Isnull(SUM(used), 0)
FROM sysindexes
WHERE indid = 255
AND id = @id
UPDATE #spt_space
SET data = @pages
WHERE objid = @id
/* index: sum(used) where indid in (0, 1, 255) - data */
UPDATE #spt_space
SET indexp = (SELECT SUM(used)
FROM sysindexes
WHERE indid IN ( 0, 1, 255 )
AND id = @id) - data
WHERE objid = @id
/* unused: sum(reserved) - sum(used) where indid in (0, 1, 255) */
UPDATE #spt_space
SET unused = reserved - (SELECT SUM(used)
FROM sysindexes
WHERE indid IN ( 0, 1, 255 )
AND id = @id)
WHERE objid = @id
UPDATE #spt_space
SET ROWS = i.ROWS
FROM sysindexes i
WHERE i.indid < 2
AND i.id = @id
AND objid = @id
FETCH NEXT FROM c_tables INTO @id
END
SELECT TOP 25 table_name = (SELECT LEFT(name, 25)
FROM sysobjects
WHERE id = objid),
ROWS = CONVERT(CHAR(11), ROWS),
reserved_kb = Ltrim(Str(reserved * d.low / 1024., 15, 0) + ' ' + 'KB'),
data_kb = Ltrim(Str(data * d.low / 1024., 15, 0) + ' ' + 'KB'),
index_size_kb = Ltrim(Str(indexp * d.low / 1024., 15, 0) + ' ' + 'KB'),
unused_kb = Ltrim(Str(unused * d.low / 1024., 15, 0) + ' ' + 'KB')
FROM #spt_space,
MASTER.dbo.spt_values d
WHERE d.NUMBER = 1
AND d.TYPE = 'E'
ORDER BY reserved DESC
DROP TABLE #spt_space
CLOSE c_tables
DEALLOCATE c_tables
© Geeks with Blogs or respective owner