Làm thế nào để tìm kích thước của một bảng trong SQL?


81

Làm thế nào để tìm kích thước của một bảng trong SQL?


13
Nó phụ thuộc vào loại DBMS. Bạn quan tâm đến cái nào?
codaddict

Câu trả lời:


110

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


Lưu ý, đối với MySQL 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
Ceasar Bautista

54

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.


Tôi sẽ đăng chính tập lệnh này - hãy hy vọng anh ấy đang sử dụng SQL Server.
SqlRyan

1
Tập lệnh xuất sắc - ngoại trừ, nó phải đọc LEN (...) - 3, không phải trừ 4. Các giá trị trả về như sau: "3746520 KB" vì vậy nó chỉ là 3 ký tự cuối cùng cần cắt bỏ. Nhưng ... thật tuyệt khi thấy một bài đăng từ 7 năm trước lại hữu ích như ngày hôm nay như nó đã trở lại vào năm 2010 !!
Mike Gledhill

biến nó thành một bảng biến đổi và bạn sẽ không phải bỏ nó. "khai báo @tmpTableSizes TABLE"
ARLibertarian

22

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

Tôi muốn thêm vào CONVERT(DECIMAL,SUM(a.total_pages)) để nó hiển thị thông tin cho các bảng nhỏ hơn GB
Bogdan Mart

21

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 bảng, bao gồm cả kích thước của các chỉ mục

sp_spaceused ‘Tablename’


11

Theo bạn, kích thước có nghĩa là số lượng bản ghi trong bảng, có tình cờ không? Trong trường hợp đó:

SELECT COUNT(*) FROM your_table_name

7

Và trong PostgreSQL:

SELECT pg_size_pretty(pg_relation_size('tablename'));

btw, để xem kết quả từ việc xóa với truy vấn này, bạn có thể cần phải hút bụi. Đây là một truy vấn để xem tất cả các bảng công khai cùng một lúc: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

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:

  1. Nhấp chuột phải vào tên cơ sở dữ liệu trong Object Explorer.
  2. Chọn Báo cáo> Báo cáo chuẩn> Sử dụng đĩa theo Bảng trên cùng.

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


Hoạt động trong sql 2008 R2 quá ... :)
manudea

3

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


2

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

2
Chào mừng bạn đến với Stack Overflow! Mặc dù mã này có thể giúp giải quyết vấn đề, nhưng nó không giải thích tại sao và / hoặc cách nó trả lời câu hỏi. Cung cấp bối cảnh bổ sung này sẽ cải thiện đáng kể giá trị giáo dục lâu dài của nó. Vui lòng chỉnh sửa câu trả lời của bạn để thêm giải thích, bao gồm những giới hạn và giả định nào được áp dụng. Tôi biết đó là một câu hỏi tồi - đó là lý do thậm chí phải rõ ràng hơn trong câu trả lời.
Toby Speight
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.