T-SQL: Listar todas las tablas de una base de datos con sus respectivos tamaños
Básicamente se trata de hacer una consulta de la tabla “sysindexes”, pero al tener muchos campos y algunos datos directamente ilegibles construimos una consulta haciendo las conversiones de datos solo de los campos que nos interesan, así como también los filtros respectivos para que no se incluya información que no sean propiedades de una tabla. Finalmente a esta consulta le podemos dar un formato numérico más legible y ordenarlo por el campo que nos sea de interés. En el siguiente ejemplo está ordenado descendente mente por número de registros que contiene la tabla.
SELECT X.[name], REPLACE(CONVERT(varchar, CONVERT(money, X.[rows]), 1), '.00', '') AS [rows], REPLACE(CONVERT(varchar, CONVERT(money, X.[reserved]), 1), '.00', '') AS [reserved], REPLACE(CONVERT(varchar, CONVERT(money, X.[data]), 1), '.00', '') AS [data], REPLACE(CONVERT(varchar, CONVERT(money, X.[index_size]), 1), '.00', '') AS [index_size], REPLACE(CONVERT(varchar, CONVERT(money, X.[unused]), 1), '.00', '') AS [unused] FROM (SELECT CAST(object_name(id) AS varchar(50)) AS [name], SUM(CASE WHEN indid < 2 THEN CONVERT(bigint, [rows]) END) AS [rows], SUM(CONVERT(bigint, reserved)) * 8 AS reserved, SUM(CONVERT(bigint, dpages)) * 8 AS data, SUM(CONVERT(bigint, used) - CONVERT(bigint, dpages)) * 8 AS index_size, SUM(CONVERT(bigint, reserved) - CONVERT(bigint, used)) * 8 AS unused FROM sysindexes WITH (NOLOCK) WHERE sysindexes.indid IN (0, 1, 255) AND sysindexes.id > 100 AND object_name(sysindexes.id) <> 'dtproperties' GROUP BY sysindexes.id WITH ROLLUP ) AS X WHERE X.[name] is not null ORDER BY X.[rows] DESC