Wie finde ich die Größe einer Tabelle in SQL?

80

Wie finde ich die Größe einer Tabelle in SQL?

anjum
quelle
13
Dies hängt vom DBMS-Typ ab. Für welches interessieren Sie sich?
Codaddict

Antworten:

107

SQL Server:-

sp_spaceused 'TableName'

Oder im Management Studio: Klicken Sie mit der rechten Maustaste auf Tabelle -> Eigenschaften -> Speicher

MySQL: -

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

Sybase: -

sp_spaceused 'TableName'

Oracle: - Wie-berechne-ich-Tabellen-Größe-in-Orakel

Kashif
quelle
Beachten Sie, dass bei MySQL data_lengthdie Größe der Tabelle in Byte und nicht die Anzahl der Zeilen angegeben wird. Siehe: dev.mysql.com/doc/refman/8.0/en/tables-table.html
Ceasar Bautista
54

Durch die Kombination der Antworten aus den Posts von Ratty und Haim (einschließlich Kommentaren) habe ich mir Folgendes ausgedacht, das für SQL Server bisher das eleganteste zu sein scheint:

-- 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

Auf diese Weise erhalten Sie eine Liste aller Ihrer Tabellen in der Reihenfolge der reservierten Größe, sortiert vom größten zum kleinsten.

Mark Meuer
quelle
Ich wollte genau dieses Skript veröffentlichen - hoffen wir, dass er SQL Server verwendet.
SqlRyan
1
Ausgezeichnetes Skript - außer es sollte LEN (...) - 3, nicht minus 4 lauten. Die Werte kommen wie folgt zurück: "3746520 KB", also müssen nur die letzten 3 Zeichen abgeschnitten werden. Aber ... cool zu sehen, wie nützlich ein Beitrag von vor 7 Jahren heute ist wie 2010 !!
Mike Gledhill
Machen Sie es zu einer variablen Tabelle und Sie müssen es nicht löschen. "@tmpTableSizes TABLE deklarieren"
ARLibertarian
22

Eine Abfrage (Änderung von https://stackoverflow.com/a/7892349/1737819 ), um eine benutzerdefinierte Namenstabellengröße in GB zu ermitteln. Sie können dies versuchen und 'YourTableName' durch den Namen Ihrer Tabelle ersetzen.

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
Entwickler Marius Žilėnas
quelle
Ich würde hinzufügen, CONVERT(DECIMAL,SUM(a.total_pages)) damit Informationen für Tabellen angezeigt werden, die kleiner als GB sind
Bogdan Mart
21

SQL Server bietet eine integrierte gespeicherte Prozedur, mit der Sie die Größe einer Tabelle, einschließlich der Größe der Indizes, einfach anzeigen können

sp_spaceused ‘Tablename’
Sameer
quelle
11

Meinen Sie mit Größe zufällig die Anzahl der Datensätze in der Tabelle? In diesem Fall:

SELECT COUNT(*) FROM your_table_name
mwittrock
quelle
7

Und in PostgreSQL:

SELECT pg_size_pretty(pg_relation_size('tablename'));
Frank Heikens
quelle
Übrigens, um Ergebnisse von Löschungen mit dieser Abfrage zu sehen, müssen Sie wahrscheinlich staubsaugen. Hier ist eine Abfrage, um alle öffentlichen Tabellen auf einmal zu sehen: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

Ich weiß, dass Sie in SQL 2012 (möglicherweise in anderen Versionen) Folgendes tun können:

  1. Klicken Sie im Objekt-Explorer mit der rechten Maustaste auf den Datenbanknamen.
  2. Wählen Sie Berichte> Standardberichte> Datenträgernutzung nach Top-Tabellen.

Dadurch erhalten Sie eine Liste der 1000 besten Tabellen und können diese nach Datengröße usw. sortieren.

Justin Clarke
quelle
Funktioniert auch in SQL 2008 R2 ... :)
Manudea
3

SQL Server, schön formatierte Tabelle für alle Tabellen in 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
quelle
2

Hier ist eine einfache Abfrage, wenn Sie nur versuchen, die größten Tabellen zu finden.

  -- 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
quelle
2
Willkommen bei Stack Overflow! Obwohl dieser Code zur Lösung des Problems beitragen kann, erklärt er nicht, warum und / oder wie er die Frage beantwortet. Die Bereitstellung dieses zusätzlichen Kontextes würde den langfristigen Bildungswert erheblich verbessern. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, einschließlich der Einschränkungen und Annahmen. Ich weiß, dass es eine schlechte Frage ist - das ist noch mehr Grund, in der Antwort klar zu sein.
Toby Speight