Як знайти розмір таблиці в SQL?


81

Як знайти розмір таблиці в SQL?


13
Це залежить від типу СУБД. Який із вас цікавить?
кодакт

Відповіді:


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: - how-do-i-Calculate-tables-size-in-oracle


Зверніть увагу, що для MySQL data_lengthце розмір таблиці в байтах, а не кількість рядків. Див .: dev.mysql.com/doc/refman/8.0/en/tables-table.html
Цезар Баутіста

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 KB", тож це лише останні 3 символи, які потрібно відсікти. Але ... класно бачити, як повідомлення від 7 років тому сьогодні є таким же корисним, як і в 2010 році !!
Mike Gledhill

зробіть це таблицею змінних, і вам не доведеться її скидати. "declare @tmpTableSizes TABLE"
ARLibertarian

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’


11

Ви випадково під розміром розумієте кількість записів у таблиці? В такому разі:

SELECT COUNT(*) FROM your_table_name

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

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! Хоча цей код може допомогти вирішити проблему, він не пояснює, чому та / або як він відповідає на питання. Забезпечення цього додаткового контексту суттєво покращило б його довгострокову освітню цінність. Будь ласка, відредагуйте свою відповідь, щоб додати пояснення, включаючи обмеження та припущення. Я знаю, що це погане запитання - це ще більше підстав бути зрозумілими у відповіді.
Toby Speight
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.