Ed Barlow created the sp__indexspace stored procedure for reporting on index usage in Sybase ASE as part of the excellent Extended Stored Procedures by Ed Barlow (AKA the Ed Barlow Stored Procedures). If you have large tables, you will receive an arithmetic overflow error. I’ve updated the stored procedure to correct the error and to format the name of the tables and indexes.
$ diff indexspace.15.old indexspace.15 25a26,33 > -------------------------------------------------------------------------------------------------- > -- Vers| Date | Who | DA | Description > -------+----------+--------------------+----+----------------------------------------------------- > -- 1.1 |11/18/2013| Jason Froebe | | Fix Arithmetic overflow error by using a bigint > -- | | | | instead of integers. Fix formatting to show entire > -- | | | | table.index name > -- 1.0 | | Edward M Barlow | | Stored procedure giving index usage > -------+----------+--------------------+----+----------------------------------------------------- 28a37,38 > declare @max_name_size varchar(3) > declare @exec_str varchar(2000) 64a75,77 > select @max_name_size = convert(varchar(3), max(char_length(name))) from #indexspace > select @max_name_size > 66,76c79,91 < select < convert(char(22),name) "Name", < convert(char(8),row_cnt) "Rows", < convert(char(16),rtrim(convert(char(30),(reserved*@pagesize)/1024))+"/"+ < rtrim(convert(char(30),(data*@pagesize)/1024))+"/"+ < rtrim(convert(char(30),(index_size*@pagesize)/1024))) "Used/Data/Idx KB", < str((row_cnt*1024)/(convert(float,data+index_size)*@pagesize),6,2) "Rows/KB", < convert(char(12),segname) "Segment" < from #indexspace < where indid<=1 < order by name --- > select @exec_str = > 'select > convert(char(' + @max_name_size + '),name) "Name", > convert(char(20),row_cnt) "Rows", > convert(char(30),rtrim(convert(char(30),(reserved*@pagesize)/1024))+"/"+ > rtrim(convert(char(30),(data*@pagesize)/1024))+"/"+ > rtrim(convert(char(30),(index_size*@pagesize)/1024))) "Used/Data/Idx KB", > str((row_cnt*1024)/(convert(float,data+index_size)*@pagesize),6,2) "Rows/KB", > convert(char(12),segname) "Segment" > from #indexspace > where indid< =1 > order by name' > exec (@exec_str) 80,85c95,101 < select < convert(char(22),name) "Name", < convert(char(8),row_cnt) "Rows", < convert(char(16),rtrim(convert(char(30),(reserved*@pagesize)/1024))+"/"+ < rtrim(convert(char(30),(data*@pagesize)/1024))+"/"+ < rtrim(convert(char(30),(index_size*@pagesize)/1024))) "Used/Data/Idx KB", --- > select @exec_str = > 'select > convert(char(' + @max_name_size + '),name) "Name", > convert(char(20),row_cnt) "Rows", > convert(char(30),rtrim(convert(char(30),(reserved*@pagesize)/1024))+"/"+ > rtrim(convert(char(30),(data*@pagesize)/1024))+"/"+ > rtrim(convert(char(30),(index_size*@pagesize)/1024))) "Used/Data/Idx KB", 88,90c104,107 < from #indexspace < where indid>1 < order by name --- > from #indexspace > where indid>1 > order by name' > exec (@exec_str)
/* Procedure copyright(c) 1995 by Edward M Barlow */ /****************************************************************************** ** ** Name : sp__indexspace ** ** Created By : Ed Barlow ** ******************************************************************************/ :r database go :r dumpdb go IF EXISTS (SELECT * FROM sysobjects WHERE name = "sp__indexspace" AND type = "P") DROP PROC sp__indexspace go CREATE PROC sp__indexspace( @objname varchar(92) = NULL , @dont_format char(1) = null ) AS -------------------------------------------------------------------------------------------------- -- Vers| Date | Who | DA | Description -------+----------+--------------------+----+----------------------------------------------------- -- 1.1 |11/18/2013| Jason Froebe | | Fix Arithmetic overflow error by using a bigint -- | | | | instead of integers. Fix formatting to show entire -- | | | | table name + index name -- 1.0 | | Edward M Barlow | | Stored procedure giving index usage -------+----------+--------------------+----+----------------------------------------------------- BEGIN declare @pagesize int /* Bytes Per Page */ declare @max_name_size varchar(3) declare @exec_str varchar(2000) set nocount on select @pagesize = low from master..spt_values where number = 1 and type = "E" select name = o.name, idxname = i.name, owner_id = o.uid, row_cnt = row_count(db_id(), i.id), reserved = reserved_pages(db_id(), i.id, i.indid), data = data_pages(db_id(), i.id, i.indid), index_size = data_pages(db_id(), i.id, i.indid), segname = s.name, indid into #indexspace from sysobjects o, sysindexes i, syssegments s where i.id = o.id and (o.type = "U" or o.name = "syslogs") and s.segment = i.segment and isnull(@objname,o.name)=o.name update #indexspace set name=user_name(owner_id)+'.'+name where owner_id>1 update #indexspace set name=name+'.'+idxname where indid!=0 update #indexspace set row_cnt=-1 where row_cnt>99999999 select @max_name_size = convert(varchar(3), max(char_length(name))) from #indexspace select @max_name_size print "Data Level (Index Type 0 or 1)" select @exec_str = 'select convert(char(' + @max_name_size + '),name) "Name", convert(char(20),row_cnt) "Rows", convert(char(30),rtrim(convert(char(30),(reserved*@pagesize)/1024))+"/"+ rtrim(convert(char(30),(data*@pagesize)/1024))+"/"+ rtrim(convert(char(30),(index_size*@pagesize)/1024))) "Used/Data/Idx KB", str((row_cnt*1024)/(convert(float,data+index_size)*@pagesize),6,2) "Rows/KB", convert(char(12),segname) "Segment" from #indexspace where indid< =1 order by name' exec (@exec_str) print "" print "Non Clustered Indexes" select @exec_str = 'select convert(char(' + @max_name_size + '),name) "Name", convert(char(20),row_cnt) "Rows", convert(char(30),rtrim(convert(char(30),(reserved*@pagesize)/1024))+"/"+ rtrim(convert(char(30),(data*@pagesize)/1024))+"/"+ rtrim(convert(char(30),(index_size*@pagesize)/1024))) "Used/Data/Idx KB", str((row_cnt*1024)/(convert(float,data+index_size)*@pagesize),6,2) "Rows/KB", convert(char(12),segname) "Segment" from #indexspace where indid>1 order by name' exec (@exec_str) drop table #indexspace return(0) END go GRANT EXECUTE ON sp__indexspace TO public go