Pregunta Obtenga el tamaño de todas las tablas en la base de datos


Heredé una base de datos de SQL Server bastante grande. Parece que ocupa más espacio del que yo esperaría, dada la información que contiene.

¿Hay alguna manera fácil de determinar cuánto espacio en el disco está consumiendo cada mesa?


896
2017-10-25 16:14


origen


Respuestas:


SELECT 
    t.NAME AS TableName,
    s.Name AS SchemaName,
    p.rows AS RowCounts,
    SUM(a.total_pages) * 8 AS TotalSpaceKB, 
    CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS TotalSpaceMB,
    SUM(a.used_pages) * 8 AS UsedSpaceKB, 
    CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS UsedSpaceMB, 
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB,
    CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSpaceMB
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
WHERE 
    t.NAME NOT LIKE 'dt%' 
    AND t.is_ms_shipped = 0
    AND i.OBJECT_ID > 255 
GROUP BY 
    t.Name, s.Name, p.Rows
ORDER BY 
    t.Name

1883
2017-10-25 16:16



Si estás usando SQL Server Management Studio (SSMS), en lugar de ejecutar una consulta (que en mi caso devolvió filas duplicadas) puedes ejecutar un informe estándar.

  1. Haga clic derecho en la base de datos
  2. Navegar a Informes> Informes estándar> Uso del disco por tabla

Nota: El nivel de compatibilidad de la base de datos debe establecerse en 90 o superior para que esto funcione correctamente. Ver http://msdn.microsoft.com/en-gb/library/bb510680.aspx


402
2018-04-24 13:46



sp_spaceused puede obtener información sobre el espacio de disco utilizado por una tabla, vista indizada o toda la base de datos.

Por ejemplo:

USE MyDatabase; GO

EXEC sp_spaceused N'User.ContactInfo'; GO

Esto informa la información de uso del disco para la tabla ContactInfo.

Para usar esto para todas las tablas a la vez:

USE MyDatabase; GO

sp_msforeachtable 'EXEC sp_spaceused [?]' GO

También puede obtener el uso del disco desde el botón derecho del ratón en la funcionalidad de Informes estándar de SQL Server. Para acceder a este informe, navegue desde el objeto del servidor en el Explorador de objetos, desplácese hasta el objeto de Bases de datos y luego haga clic con el botón derecho en cualquier base de datos. Desde el menú que aparece, seleccione Informes, luego Informes estándar y luego "Uso del disco por partición: [Nombre de la base de datos]".


78
2017-10-25 16:24



 exec  sp_spaceused N'dbo.MyTable'

Para todas las tablas, use ... (agregando de los comentarios de Paul)

exec sp_MSForEachTable 'exec sp_spaceused [?]'

26
2017-10-25 16:17



Después de algunas búsquedas, no pude encontrar una manera fácil de obtener información sobre todas las tablas. Hay un práctico procedimiento almacenado llamado sp_spaceused que devolverá todo el espacio utilizado por la base de datos. Si se proporciona un nombre de tabla, devuelve el espacio utilizado por esa tabla. Sin embargo, los resultados devueltos por el procedimiento almacenado no se pueden ordenar, ya que las columnas son valores de caracteres.

El siguiente script generará la información que estoy buscando.

create table #TableSize (
    Name varchar(255),
    [rows] int,
    reserved varchar(255),
    data varchar(255),
    index_size varchar(255),
    unused varchar(255))
create table #ConvertedSizes (
    Name varchar(255),
    [rows] int,
    reservedKb int,
    dataKb int,
    reservedIndexSize int,
    reservedUnused int)

EXEC sp_MSforeachtable @command1="insert into #TableSize
EXEC sp_spaceused '?'"
insert into #ConvertedSizes (Name, [rows], reservedKb, dataKb, reservedIndexSize, reservedUnused)
select name, [rows], 
SUBSTRING(reserved, 0, LEN(reserved)-2), 
SUBSTRING(data, 0, LEN(data)-2), 
SUBSTRING(index_size, 0, LEN(index_size)-2), 
SUBSTRING(unused, 0, LEN(unused)-2)
from #TableSize

select * from #ConvertedSizes
order by reservedKb desc

drop table #TableSize
drop table #ConvertedSizes

25
2017-10-25 16:17



Aquí hay otro método: usando SQL Server Management Studio, en Explorador de objetos, vaya a su base de datos y seleccione Mesas

enter image description here

Luego abre el Detalles del explorador de objetos (presionando F7 o yendo a Vista-> Detalles del explorador de objetos) En la página de detalles del explorador de objetos, haga clic con el botón derecho en el encabezado de la columna y habilite las columnas que le gustaría ver en la página. Puede ordenar los datos por cualquier columna también.

enter image description here


17
2018-01-18 17:11



Las consultas anteriores son útiles para encontrar la cantidad de espacio utilizada por la tabla (índices incluidos), pero si desea comparar cuánto espacio utilizan los índices en la tabla, use esta consulta:

SELECT
    OBJECT_NAME(i.OBJECT_ID) AS TableName,
    i.name AS IndexName,
    i.index_id AS IndexID,
    8 * SUM(a.used_pages) AS 'Indexsize(KB)'
FROM
    sys.indexes AS i JOIN 
    sys.partitions AS p ON p.OBJECT_ID = i.OBJECT_ID AND p.index_id = i.index_id JOIN 
    sys.allocation_units AS a ON a.container_id = p.partition_id
GROUP BY
    i.OBJECT_ID,
    i.index_id,
    i.name
ORDER BY
    OBJECT_NAME(i.OBJECT_ID),
    i.index_id

13
2017-07-11 18:36