Jak znaleźć rozmiar tabeli w SQL?

81

Jak znaleźć rozmiar tabeli w SQL?

anjum
źródło
13
To zależy od typu DBMS. Który Cię interesuje?
codaddict

Odpowiedzi:

110

SQL Server: -

sp_spaceused 'TableName'

Lub w studiu zarządzania: Kliknij prawym przyciskiem myszy tabelę -> Właściwości -> Pamięć

MySQL: -

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

Sybase: -

sp_spaceused 'TableName'

Oracle: - jak-zrobić-i-obliczyć-rozmiar-tabel-w-wyroczni

Kashif
źródło
Uwaga, w przypadku MySQL data_lengthjest to rozmiar tabeli w bajtach, a nie liczba wierszy. Zobacz: dev.mysql.com/doc/refman/8.0/en/tables-table.html
Ceasar Bautista
54

Łącząc odpowiedzi z postów Ratty'ego i Haima (w tym komentarze), wymyśliłem to, które dla SQL Server wydaje się jak dotąd najbardziej eleganckie:

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

To daje ci listę wszystkich twoich tabel w kolejności zarezerwowanego rozmiaru, w kolejności od największego do najmniejszego.

Mark Meuer
źródło
Miałem zamieścić ten właśnie skrypt - miejmy nadzieję, że używa SQL Server.
SqlRyan
1
Świetny skrypt - z wyjątkiem tego, że powinien brzmieć LEN (...) - 3, a nie minus 4. Wartości wracają w ten sposób: "3746520 KB", więc to tylko ostatnie 3 znaki, które należy uciąć. Ale ... fajnie zobaczyć, jak post sprzed 7 lat jest tak samo przydatny dzisiaj, jak w 2010 roku !!
Mike Gledhill,
uczyń z niej zmienną tabelę i nie będziesz musiał jej porzucać. „Zadeklaruj @tmpTableSizes TABLE”
ARLibertarian
22

Zapytanie (modyfikacja https://stackoverflow.com/a/7892349/1737819 ) mające na celu znalezienie niestandardowego rozmiaru tabeli nazw w GB. Możesz spróbować tego, zamień „YourTableName” na nazwę swojej tabeli.

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
Deweloper Marius Žilėnas
źródło
Dodałbym, CONVERT(DECIMAL,SUM(a.total_pages)) żeby wyświetlał informacje o stolikach mniejszych niż GB
Bogdan Mart
21

SQL Server udostępnia wbudowaną procedurę składowaną, którą można uruchomić, aby łatwo pokazać rozmiar tabeli, w tym rozmiar indeksów

sp_spaceused ‘Tablename’
Sameer
źródło
11

Czy przypadkiem wielkość ma na myśli liczbę rekordów w tabeli? W tym wypadku:

SELECT COUNT(*) FROM your_table_name
mwittrock
źródło
7

A w PostgreSQL:

SELECT pg_size_pretty(pg_relation_size('tablename'));
Frank Heikens
źródło
btw, aby zobaczyć wyniki usunięć za pomocą tego zapytania, prawdopodobnie musisz odkurzyć. Oto zapytanie, aby wyświetlić wszystkie publiczne stoły jednocześnie: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

Wiem, że w SQL 2012 (może działać w innych wersjach) możesz wykonać następujące czynności:

  1. Kliknij prawym przyciskiem myszy nazwę bazy danych w Eksploratorze obiektów.
  2. Wybierz opcję Raporty> Raporty standardowe> Wykorzystanie dysku według najważniejszych tabel.

Spowoduje to wyświetlenie listy 1000 najpopularniejszych tabel, a następnie możesz uporządkować ją według rozmiaru danych itp.

Justin Clarke
źródło
Działa również w sql 2008 R2 ... :)
manudea
3

SQL Server, ładnie sformatowana tabela dla wszystkich tabel w 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
źródło
2

Oto proste zapytanie, jeśli próbujesz znaleźć największe tabele.

  -- 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
źródło
2
Witamy w Stack Overflow! Chociaż ten kod może pomóc w rozwiązaniu problemu, nie wyjaśnia, dlaczego i / lub jak odpowiada na pytanie. Zapewnienie tego dodatkowego kontekstu znacznie poprawiłoby jego długoterminową wartość edukacyjną. Proszę edytować swoje odpowiedzi, aby dodać wyjaśnienie, w tym, co stosuje się ograniczenia i założenia. Wiem, że to kiepskie pytanie - to jeszcze większy powód, aby odpowiedzieć na to pytanie.
Toby Speight