在Oracle中查看各表占用表空间的大小及碎片大小,可通过以下方法实现:
一、查看各表占用表空间的大小
1.查询dba_segments视图
sqlCopy Code
SELECT owner, segment_name AS table_name, ROUND(SUM(bytes)/1024/1024, 2) AS "占用空间(MB)" FROM dba_segments WHERE segment_type = 'TABLE' GROUP BY owner, segment_name ORDER BY 3 DESC;
- 说明:直接统计每个表(segment_type='TABLE')分配的物理空间大小。结果按占用空间降序排列24。
2.查询dba_extents视图
sqlCopy Code
SELECT segment_name AS table_name, ROUND(SUM(bytes)/1024/1024, 2) AS "占用空间(MB)" FROM dba_extents WHERE segment_type = 'TABLE' GROUP BY segment_name ORDER BY 2 DESC;
- 说明:通过聚合每个表的区(extent)大小计算总占用空间12。
二、查看表的碎片大小
1.使用dbms_space包
sqlCopy Code
DECLARE su NUMBER; -- 已使用空间(单位:字节) sa NUMBER; -- 已分配空间(单位:字节) cp NUMBER; -- 行链接/迁移百分比 BEGIN
dbms_space.object_space_usage( segment_owner => 'SCHEMA_NAME', segment_name => 'TABLE_NAME', segment_type => 'TABLE', used_space => su, allocated_space => sa, chained_percent => cp ); dbms_output.put_line('已分配空间(MB): ' || ROUND(sa/1024/1024, 2)); dbms_output.put_line('已使用空间(MB): ' || ROUND(su/1024/1024, 2)); dbms_output.put_line('碎片大小(MB): ' || ROUND((sa - su)/1024/1024, 2)); END; /
- 说明:通过dbms_space.object_space_usage获取表的已分配空间和实际使用空间,差值即为碎片大小12。
2.结合dba_segments与实际数据估算
sqlCopy Code
-- 步骤1:查询表分配的物理空间 SELECT ROUND(bytes/1024/1024, 2) AS allocated_mb FROM dba_segments WHERE segment_name = 'TABLE_NAME' AND owner = 'SCHEMA_NAME'; -- 步骤2:分析表统计信息(需先收集统计信息) EXEC
dbms_stats.gather_table_stats('SCHEMA_NAME', 'TABLE_NAME'); -- 步骤3:查询实际数据占用空间 SELECT ROUND(num_rows * avg_row_len/1024/1024, 2) AS used_mb FROM dba_tables WHERE table_name = 'TABLE_NAME' AND owner = 'SCHEMA_NAME';
- 说明:通过统计信息估算实际数据大小,与分配空间的差值可反映碎片46。
三、补充说明
- 权限要求:需具备DBA权限或访问dba_segments、dba_extents等系统视图的权限。
- 碎片定义:碎片为已分配但未被有效利用的空间,可能由删除、更新操作导致。
- 优化建议:若碎片率较高,可通过ALTER TABLE ... MOVE或在线重定义(dbms_redefinition)整理碎片4。
以上方法可综合使用,dba_segments适合快速查看表空间占用,dbms_space提供精确的碎片分析12。