¿Cómo encontrar el tamaño de una tabla en SQL?

81

¿Cómo encontrar el tamaño de una tabla en SQL?

anjum
fuente
13
Depende del tipo de DBMS. Cual te interesa?
codaddict

Respuestas:

110

Servidor SQL:-

sp_spaceused 'TableName'

O en el estudio de administración: haga clic derecho en la tabla -> Propiedades -> Almacenamiento

MySQL: -

SELECT table_schema, table_name, data_length, index_length FROM information_schema.tables

Sybase: -

sp_spaceused 'TableName'

Oracle: - ¿cómo-puedo-calcular-el-tamaño-de-tablas-en-oracle

Kashif
fuente
Tenga en cuenta que para MySQL data_lengthes el tamaño de la tabla en bytes, no el número de filas. Ver: dev.mysql.com/doc/refman/8.0/en/tables-table.html
Ceasar Bautista
54

Combinando las respuestas de las publicaciones de ratty y Haim (incluidos los comentarios), se me ocurrió esto, que para SQL Server parece ser el más elegante hasta ahora:

-- DROP TABLE #tmpTableSizes
CREATE TABLE #tmpTableSizes
(
    tableName varchar(100),
    numberofRows varchar(100),
    reservedSize varchar(50),
    dataSize varchar(50),
    indexSize varchar(50),
    unusedSize varchar(50)
)
insert #tmpTableSizes
EXEC sp_MSforeachtable @command1="EXEC sp_spaceused '?'"


select  * from #tmpTableSizes
order by cast(LEFT(reservedSize, LEN(reservedSize) - 4) as int)  desc

Esto le brinda una lista de todas sus tablas en orden de tamaño reservado, ordenadas de mayor a menor.

Mark Meuer
fuente
Iba a publicar este mismo script, esperemos que esté usando SQL Server.
SqlRyan
1
Excelente secuencia de comandos, excepto que debe leer LEN (...) - 3, no menos 4. Los valores vuelven así: "3746520 KB", por lo que son solo los últimos 3 caracteres los que deben cortarse. Pero ... ¡es genial ver cómo una publicación de hace 7 años es tan útil hoy como lo fue en 2010!
Mike Gledhill
conviértala en una tabla variable y no tendrá que soltarla. "declare @tmpTableSizes TABLE"
ARLibertarian
22

Una consulta (modificación de https://stackoverflow.com/a/7892349/1737819 ) para encontrar un tamaño de tabla de nombres personalizado en GB. Puede intentar esto, reemplace 'YourTableName' con el nombre de su tabla.

SELECT 
    t.NAME AS TableName,    
    p.rows AS RowCounts,
    CONVERT(DECIMAL,SUM(a.total_pages)) * 8 / 1024 / 1024 AS TotalSpaceGB, 
    SUM(a.used_pages)  * 8 / 1024 / 1024 AS UsedSpaceGB , 
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 / 1024 / 1024 AS UnusedSpaceGB
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 = 'YourTable'
    AND t.is_ms_shipped = 0
    AND i.OBJECT_ID > 255 
GROUP BY 
    t.Name, s.Name, p.Rows
ORDER BY 
    UsedSpaceGB DESC, t.Name
Desarrollador Marius Žilėnas
fuente
Agregaría CONVERT(DECIMAL,SUM(a.total_pages)) para que mostrara información para tablas más pequeñas que GB
Bogdan Mart
21

SQL Server proporciona un procedimiento almacenado integrado que puede ejecutar para mostrar fácilmente el tamaño de una tabla, incluido el tamaño de los índices.

sp_spaceused ‘Tablename’
Sameer
fuente
11

¿Por tamaño te refieres al número de registros en la tabla, por casualidad? En ese caso:

SELECT COUNT(*) FROM your_table_name
mwittrock
fuente
7

Y en PostgreSQL:

SELECT pg_size_pretty(pg_relation_size('tablename'));
Frank Heikens
fuente
por cierto, para ver los resultados de las eliminaciones con esta consulta, probablemente necesite aspirar. Aquí hay una consulta para ver todas las tablas públicas a la vez:SELECT table_name, pg_size_pretty(pg_relation_size(table_names.table_name)) AS size from (select table_name from information_schema.tables where table_schema = 'public') AS table_names ORDER BY pg_relation_size(table_names.table_name) DESC;
Noumenon
7

Sé que en SQL 2012 (puede funcionar en otras versiones) puede hacer lo siguiente:

  1. Haga clic derecho en el nombre de la base de datos en el Explorador de objetos.
  2. Seleccione Informes> Informes estándar> Uso de disco por tablas principales.

Eso le dará una lista de las 1000 tablas principales y luego podrá ordenarlas por tamaño de datos, etc.

Justin Clarke
fuente
También funciona en sql 2008 R2 ... :)
manudea
3

SQL Server, tabla bien formateada para todas las tablas en KB / MB:

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
Kairan
fuente
2

Aquí hay una consulta simple, si solo está tratando de encontrar las tablas más grandes.

  -- Find largest table partitions
 SELECT top 20 obj.name, LTRIM (STR ( sz.in_row_data_page_count * 8, 15, 0) + ' KB') as Size, * FROM sys.dm_db_partition_stats sz
inner join sys.objects obj on obj.object_id = sz.object_id
  order by sz.in_row_data_page_count desc
Andrew Walker
fuente
2
¡Bienvenido a Stack Overflow! Aunque este código puede ayudar a resolver el problema, no explica por qué y / o cómo responde la pregunta. Proporcionar este contexto adicional mejoraría significativamente su valor educativo a largo plazo. Por favor, editar su respuesta para agregar explicación, incluyendo lo que se aplican limitaciones y supuestos. Sé que es una mala pregunta, esa es una razón más para ser clara en la respuesta.
Toby Speight