dbcc showcontig( 'TheTable' ) WITH tableresults, ALL_INDEXESRun the above in query analyzer and copy/paste the result over to excel, add two columns: ActualCount / BestCount, and ( AcutalCount - BestCount ) * 8192. These two numbers give you a better look at how many times too big the number of index pages are and how many bytes of waste you have. The worst ones give you candidates for reindexing.
dbcc updateusage(0) with no_infomsgs -- only needs to be run once declare @dbsize dec(15,0) declare @bytesperpage dec(15,0) declare @unused dec(15,0) /* ** reserved: sum(reserved) where indid in (0, 1, 255) ** data: sum(dpages) where indid < 2 + sum(used) where indid = 255 (text) ** indexp: sum(used) where indid in (0, 1, 255) - data ** unused: sum(reserved) - sum(used) where indid in (0, 1, 255) */ create table #spt_space ( [Database Name] varchar(64), [Table Name] varchar(64), rows int null, reserved dec(15,0) null, data dec(15,0) null, indexp dec(15,0) null, unused dec(15,0) null ) set nocount on select @dbsize = sum(convert(dec(15),size)) from dbo.sysfiles where (status & 64 = 0) select @bytesperpage = low from master.dbo.spt_values where number = 1 and type = 'E' select @unused = sum(convert(dec(15),reserved)) from sysindexes where indid in (0, 1, 255) insert into #spt_space values ( db_name(), '', null, @dbsize, null, null, @dbsize - @unused ) create table #temp ( uid int identity(1,1), id int, [Table Name] varchar(64), pages1 int null, pages2 int null, reserved int null, indexexp int null, rows int null, unused int null ) insert into #temp ( id, [Table Name] ) select id, name from sysobjects where xType = 'U' update #temp set pages1 = ( select sum(dpages) from sysindexes where indid < 2 and #temp.id = sysindexes.id ) update #temp set pages2 = ( select isnull(sum(used), 0) from sysindexes where indid = 255 and #temp.id = sysindexes.id ) update #temp set reserved = ( select sum(reserved) from sysindexes where indid in (0, 1, 255) and #temp.id = sysindexes.id ) update #temp set indexexp = ( select sum(used) from sysindexes where indid in (0, 1, 255) and #temp.id = sysindexes.id ) - ( pages1 + pages2 ) update #temp set unused = reserved - indexexp - ( pages1 + pages2 ) update #temp set rows = ( select rows from sysindexes where indid < 2 and #temp.id = sysindexes.id ) --select * from #temp insert into #spt_space select db_name(), [Table Name], rows, reserved, pages1 + pages2, indexexp, unused from #temp -- header row for Excel select 'Database Name', 'Table Name', 'rows', 'Allocated space', 'Data space', 'Index space', 'Unused space', 'Percent Data', 'Percent Index', 'Percent Unused', 'Percent of Database' -- real data select [Database Name], [Table Name], rows, [Allocated space] = reserved * @bytesperpage, [Data space] = data * @bytesperpage, [Index space] = indexp * @bytesperpage, [Unused space] = unused * @bytesperpage, [Percent Data] = case when reserved > 0 then cast( data / reserved * 100.0 as dec(5,1)) else 0.0 end, [Percent Index] = case when reserved > 0 then cast( indexp / reserved * 100.0 as dec(5,1)) else 0.0 end, [Percent Unused] = case when reserved > 0 then cast( unused / reserved * 100.0 as dec(5,1)) else 0.0 end, [Percent of Database] = cast( reserved / @dbsize * 100.0 as dec(5,1)) from #spt_space order by [Table Name] --order by [Allocated space] --order by [Percent Unused] drop table #spt_space drop table #tempAgain these two result sets can be copied/pasted into Excel for further slicing and dicing (I suppose that could be contracted to Roncoing *bg*)