最近oracle开发过程中,需要了解到表的使用情况,特意去研究了下oracle如何查看表空间使用情况,就稍微加工了下sql,进入正题:
使用到的oracle表(需要有访问权限)
dba_segments 表空间表使用空间明细表
dba_data_files 表空间使用空间明细表
dba_free_space 表空间空闲空间明细表
SQL如下,直接贴到plsql上执行就行:(tablespace表空间前缀 tablename表名(可为空))
select tablespace_name, -- 表空间
total_space||'M' as total_space, -- 表空间物理总大小
(total_space-free_space)||'M' use_space, -- 表空间物理使用大小
round(100*(total_space-free_space)/total_space,1)||'%' use_percent, -- 表空间物理使用百分比
round(100*sum(tab_use_space) over (partition by tablespace_name)/total_space,1)||'%' act_use_percent, -- 表空间实际使用百分比
free_space||'M' as free_space, -- 表空间物理空闲大小
round(100*free_space/total_space,1)||'%' free_percent, -- 表空间物理空闲百分比
table_name, -- 表空间表名
sum(tab_use_space) over (partition by tablespace_name)||'M' total_tab_use, -- 表空间表总使用大小
tab_use_space||'M' as tab_use_space, -- 表空间表使用大小
round(100*tab_use_space/sum(tab_use_space) over (partition by tablespace_name),1)||'%' tab_use_percent -- 表空间表占总表大小百分比
from
(
select g.tablespace_name,
(select sum(bytes/1024/1024) from dba_data_files a where a.tablespace_name = g.tablespace_name) total_space,
(select sum(bytes/1024/1024) from dba_free_space b where b.tablespace_name = g.tablespace_name) free_space,
g.segment_name table_name,g.BYTES/1024/1024 tab_use_space
from dba_segments g
where g.segment_type = 'TABLE'
and g.tablespace_name like &tablespace||'%'
and g.segment_name = nvl(trim(&tablename),g.segment_name)
);