對於大型資料庫,Oracle佔用的磁碟空間非常大,掌握資料庫中那些使用者、表佔用了多殺磁碟空間,以及增長情況,可以方便日後對磁碟系統進行維護和擴充。
對Oracle磁碟空間使用方式,可以分為按照資料表空間、使用者或者表來進行統計。
(一)、資料表空間
計算資料表空間的剩餘大小
select A.TABLESPACE_NAME,A.BYTES/(1024*1024*1024) "SPACE(G)",
C.BYTES/(1024*1024) "FREE SPACE(M)",(C.BYTES*100)/A.BYTES "% FREE"
FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_FREE C
WHERE A.TABLESPACE_NAME=C.TABLESPACE_NAME;
或者
select tablespace_name, sum(bytes)/(1024*1024*1024) "SPACE(G)"
from dba_free_space
group by tablespace_name;
(二)、使用者
計算每個使用者佔用的磁碟空間
select owner,sum(bytes)/1024/1024/1024 "Space(G)"
from dba_segments
group by owner
order by 2;
計算某個使用者佔用的磁碟空間
select owner,sum(bytes)/1024/1024/1024 "Space(G)"
from dba_segments
where owner='LIAOJL'
group by owner;
(三)、表
Oracle都是以段為儲存的,segment_name包含了表、索引、復原段等,所以在dba_extents,dba_segments都可以找到佔用空間大小的資訊。
select sum(bytes)/1024/1024 "Space(M)"
from dba_extents
where owner='LIAOJL' and segment_name='STUDENTS';
dba_segments也可以計算表的大小:
select segment_name,bytes/1024/1024 "Space(MB)"
from dba_segments
where SEGMENT_TYPE='TABLE' and segment_name=upper('你要尋找的表的名字');
當時上面的寫法不完全正確,當表是分區表,dba_segments有多條資訊,可改成:
select segment_name,sum(bytes)/1024/1024 "Space(MB)"
from dba_segments
where segment_name=upper('你要尋找的表的名字');
上述方法對於一個很大的資料庫,SQL語句執行起來會很慢,而且消耗資料庫資源。Oracle支援對錶進行分析,執行分析表操作後可以在dba_tables等系統資料表中查詢表大小、行數等資訊,不過這些資訊不是即時更新的,可以在資料庫空閑時,通過計劃任務來更新。
分析SQL方法:
analyze table tab_name compute statistics;
表太大的話可以執行:
analyze table tab_name estimate statistics;