Как узнать размер таблицы в SQL?

81

Как узнать размер таблицы в SQL?

анджум
источник
13
Это зависит от типа СУБД. Что вас интересует?
codaddict

Ответы:

110

SQL Server: -

sp_spaceused 'TableName'

Или в студии управления: щелкните правой кнопкой мыши таблицу -> Свойства -> Хранилище.

MySQL: -

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

Sybase: -

sp_spaceused 'TableName'

Oracle: - как-я-вычислить-размер-таблицы-в оракуле

Кашиф
источник
Обратите внимание, что для MySQL data_lengthэто размер таблицы в байтах, а не количество строк. См .: dev.mysql.com/doc/refman/8.0/en/tables-table.html
Ceasar Bautista,
54

Объединив ответы из сообщений ratty и Haim (включая комментарии), я придумал следующее, которое для SQL Server пока кажется наиболее элегантным:

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

Это дает вам список всех ваших таблиц в порядке зарезервированного размера, от наибольшего к наименьшему.

Марк Меуэр
источник
Я собирался опубликовать этот самый сценарий - будем надеяться, что он использует SQL Server.
SqlRyan
1
Отличный скрипт - за исключением того, что он должен читать LEN (...) - 3, а не минус 4. Значения возвращаются следующим образом: «3746520 КБ», поэтому нужно обрезать только последние 3 символа. Но ... здорово видеть, как публикация 7-летней давности сегодня так же полезна, как и в 2010 году !!
Майк Гледхилл,
сделайте это таблицей переменных, и вам не придется ее отбрасывать. «declare @tmpTableSizes TABLE»
АРЛибертариан
22

Запрос (модификация https://stackoverflow.com/a/7892349/1737819 ), чтобы найти размер настраиваемой таблицы имен в ГБ. Вы можете попробовать это, заменив «YourTableName» на имя своей таблицы.

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
Разработчик Мариус Жиленас
источник
Я бы добавил, CONVERT(DECIMAL,SUM(a.total_pages)) чтобы он отображал информацию для таблиц размером меньше ГБ
Богдан Март
21

SQL Server предоставляет встроенную хранимую процедуру, которую можно запустить, чтобы легко показать размер таблицы, включая размер индексов.

sp_spaceused ‘Tablename’
Самир
источник
16

SQL Server предоставляет встроенную хранимую процедуру, которую вы можете запустить, чтобы легко показать размер таблицы, включая размер индексов… что может вас удивить.

Синтаксис:

 sp_spaceused ‘Tablename’

см. в:

http://www.howtogeek.com/howto/database/determine-size-of-a-table-in-sql-server/

Хаим Евги
источник
11

Вы под размером случайно подразумеваете количество записей в таблице? В этом случае:

SELECT COUNT(*) FROM your_table_name
Mwittrock
источник
7

А в PostgreSQL:

SELECT pg_size_pretty(pg_relation_size('tablename'));
Фрэнк Хайкенс
источник
кстати, чтобы увидеть результаты удалений с помощью этого запроса, вам, вероятно, потребуется очистить. Вот запрос , чтобы увидеть все открытые таблицы сразу: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;
Ноумен
7

Я знаю, что в SQL 2012 (может работать и в других версиях) вы можете делать следующее:

  1. Щелкните правой кнопкой мыши имя базы данных в обозревателе объектов.
  2. Выберите Отчеты> Стандартные отчеты> Использование диска по верхним таблицам.

Это даст вам список из 1000 лучших таблиц, а затем вы сможете отсортировать его по размеру данных и т. Д.

Джастин Кларк
источник
Работает и в sql 2008 R2 ... :)
manudea
3

SQL Server, красиво отформатированная таблица для всех таблиц в КБ / МБ:

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
Кайран
источник
2

Вот простой запрос, если вы просто пытаетесь найти самые большие таблицы.

  -- 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
Эндрю Уокер
источник
2
Добро пожаловать в Stack Overflow! Хотя этот код может помочь решить проблему, он не объясняет, почему и / или как он отвечает на вопрос. Предоставление этого дополнительного контекста значительно улучшило бы его долгосрочную образовательную ценность. Пожалуйста , измените свой ответ , чтобы добавить объяснение, в том числе то , что применять ограничения и допущения. Я знаю, что это плохой вопрос - это еще одна причина для ясности в ответе.
Тоби Спейт