Як знайти розмір таблиці в SQL?
Відповіді:
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
data_lengthце розмір таблиці в байтах, а не кількість рядків. Див .: dev.mysql.com/doc/refman/8.0/en/tables-table.html
Поєднуючи відповіді з дописів 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
Це дає вам список усіх ваших таблиць у порядку зарезервованого розміру, упорядкованих від найбільшого до найменшого.
Запит (модифікація 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)) щоб вона відображала інформацію для таблиць, розмір яких менше ГБ
SQL Server надає вбудовану збережену процедуру, яку ви можете запустити, щоб легко показати розмір таблиці, включаючи розмір індексів ... що може вас здивувати.
Синтаксис:
sp_spaceused ‘Tablename’
див. у:
http://www.howtogeek.com/howto/database/determine-size-of-a-table-in-sql-server/
А в 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;
Я знаю, що в SQL 2012 (може працювати в інших версіях) ви можете зробити наступне:
Це дасть вам список найкращих 1000 таблиць, а потім ви зможете впорядкувати його за розміром даних тощо.
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
Ви можете вказати відповідь Marc_s в іншій темі, Дуже корисно.
Ось простий запит, якщо ви просто намагаєтеся знайти найбільші таблиці.
-- 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