Làm thế nào để tìm kích thước của một bảng trong SQL?
Câu trả lời:
Máy chủ SQL: -
sp_spaceused 'TableName'
Hoặc trong studio quản lý: Nhấp chuột phải vào bảng -> Thuộc tính -> Lưu trữ
MySQL: -
SELECT table_schema, table_name, data_length, index_length FROM information_schema.tables
Sybase: -
sp_spaceused 'TableName'
Oracle: - how-do-i-Calcul-table-size-in-oracle
data_lengthlà kích thước của bảng tính bằng byte, không phải số hàng. Xem: dev.mysql.com/doc/refman/8.0/en/tables-table.html
Kết hợp các câu trả lời từ các bài đăng của ratty và Haim (bao gồm cả nhận xét), tôi đã nghĩ ra điều này, điều này đối với SQL Server có vẻ là tốt nhất cho đến nay:
-- 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
Điều này cung cấp cho bạn danh sách tất cả các bảng của bạn theo thứ tự kích thước dành riêng, được sắp xếp từ lớn nhất đến nhỏ nhất.
Một truy vấn (sửa đổi của https://stackoverflow.com/a/7892349/1737819 ) để tìm kích thước bảng tên tùy chỉnh tính bằng GB. Bạn có thể thử cách này, thay thế 'YourTableName' bằng tên bảng của bạn.
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)) để nó hiển thị thông tin cho các bảng nhỏ hơn GB
SQL Server cung cấp một thủ tục được lưu trữ sẵn mà bạn có thể chạy để dễ dàng hiển thị kích thước của một bảng, bao gồm cả kích thước của các chỉ mục… điều này có thể làm bạn ngạc nhiên.
Cú pháp:
sp_spaceused ‘Tablename’
nhìn vào :
http://www.howtogeek.com/howto/database/detfining-size-of-a-table-in-sql-server/
Và trong 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;
Tôi biết rằng trong SQL 2012 (có thể hoạt động trong các phiên bản khác), bạn có thể làm như sau:
Điều đó sẽ cung cấp cho bạn danh sách 1000 bảng hàng đầu và sau đó bạn có thể sắp xếp nó theo kích thước dữ liệu, v.v.
SQL Server, bảng được định dạng độc đáo cho tất cả các bảng trong 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
Bạn có thể tham khảo câu trả lời của Marc_s trong một chủ đề khác, Rất hữu ích.
Đây là một truy vấn đơn giản, nếu bạn chỉ đang cố gắng tìm các bảng lớn nhất.
-- 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