標籤:
對於大型資料庫,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; /*SELECT tablespace_name, sum ( blocks ) as free_blk , trunc ( sum ( bytes ) /(1024*1024) ) as free_m, max ( bytes ) / (1024) as big_chunk_k, count (*) as num_chunks FROM dba_free_space GROUP BY tablespace_name;*/
/*
* SqlName: obj_seg
* 2006-11-17 By HuiYi
* 查詢對象大小
*/
select owner,sum(bytes)/1024/1024/1024 "Space(G)" from dba_segments group by owner order by 2 desc col segment_name format a30
col segment_type format a15
col tablespace_name format a10
col bytes heading "Size(M)"
with t as(
select segment_name,owner,owner||‘.‘||segment_name,
segment_type,
tablespace_name,
bytes / 1024 / 1024 bytes
from dba_segments
where owner = upper(‘&user‘)
order by bytes desc
)
select * from t where rownum<10;
Oracle磁碟空間使用統計