Oracle 官方建議:超過 2 GB 的資料表應採用分區表技術。掌握各資料庫查詢表/表空間大小的方法,是容量規劃與效能調優的基礎功夫。
SELECT segment_name,
ROUND(SUM(bytes)/1024/1024, 2) AS size_mb
FROM user_extents
GROUP BY segment_name
ORDER BY size_mb DESC;
SELECT tablespace_name,
ROUND(SUM(bytes)/1024/1024, 2) AS size_mb
FROM dba_segments
GROUP BY tablespace_name
ORDER BY size_mb DESC;
提示:若安裝 OEM Cloud Control,圖形介面同樣可視化呈現;無圖形環境時 SQL 腳本最便攜。
右鍵點選資料表 → 「顯示詳細資料」→ 「儲存空間」分頁,即可看到資料、索引、LOB 佔用頁數與大小。
-- 查詢特定表大小 (KB)
CALL SYSPROC.ADMIN_GET_TAB_INFO('SCHEMA', 'TABLE_NAME');
-- 或使用表函數 (需 SYSTOOLSPACE)
SELECT TABSCHEMA, TABNAME,
DATA_OBJECT_P_SIZE + INDEX_OBJECT_P_SIZE + LONG_OBJECT_P_SIZE + LOB_OBJECT_P_SIZE + XML_OBJECT_P_SIZE AS TOTAL_KB
FROM TABLE(SYSPROC.ADMIN_GET_TAB_INFO('SCHEMA', 'TABLE_NAME')) AS T;
EXEC sp_spaceused 'SchemaName.TableName', @updateusage = 'TRUE';
SELECT
t.NAME AS TableName,
s.Name AS SchemaName,
p.rows AS RowCounts,
SUM(a.total_pages) * 8 AS TotalSpaceKB,
SUM(a.used_pages) * 8 AS UsedSpaceKB,
(SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
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.is_ms_shipped = 0
GROUP BY t.Name, s.Name, p.Rows
ORDER BY TotalSpaceKB DESC;
| 資料庫 | 核心系統表/視圖 | 單位 | 權限需求 |
|---|---|---|---|
| Oracle | USER_EXTENTS / DBA_SEGMENTS | Bytes → MB | DBA 權限查全庫 |
| DB2 | SYSCAT.TABLES / ADMIN_GET_TAB_INFO | Pages / KB | EXPLAIN 權限或 SYSMON |
| SQL Server | sys.allocation_units / sp_spaceused | Pages (8KB) → KB | VIEW DEFINITION / db_owner |
AUTO_RUNSTATS,確保統計資訊即時,避免查詢計劃偏差。