统计Oracle数据库用户所有表的大小
SELECT OWNER as "用户名", sum(BYTES) / 1024 / 1024 / 1024 as "所有表的大小(GB)"
FROM DBA_SEGMENTS
WHERE SEGMENT_NAME in (select t2.OBJECT_NAME
from dba_objects t2
where t2.OBJECT_TYPE = 'TABLE')
group by OWNER order by 2 desc;
经过测试发现,从DBA_EXTENTS中统计出来的大小和DBA_SEGMENTS一样:
SELECT OWNER as "用户名", sum(BYTES) / 1024 / 1024 / 1024 as "所有表的大小(GB)"
FROM DBA_EXTENTS
WHERE SEGMENT_NAME in (select t2.OBJECT_NAME
from dba_objects t2
where t2.OBJECT_TYPE = 'TABLE')
group by OWNER order by 2 desc;
在metalink上搜索到如下资料: Doc ID: Note:463101.1
HOW TO DISCOVER AND FIX THE MISTMATCH BETWEEN DBA_SEGMENTS AND DBA_EXTENTS DICTIONARY VIEWS
里面讲到当DML/DDL操作(parallel index creation, frequent deletes/inserts)会导致这种不一致,
导致dba_segments中的不正确, 所以dba_extents中记录的分配给段的空间值才是可信的值。