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