某天小白我接到一個小小的一句話的任務,讓我把目前項目的數據庫所有表的大小統計下,其實這種操作對於你們大多數人可能都是隨手拈來的事,但是我不行,所有就為自己做了一個簡單記錄。基本都百度上的,有問題之處請不吝賜教!!!
1、某個表大小查詢:
以通過系統視圖DBA_SEGMENTS、DBA_TABLES、USER_SEGMETNS、User_Extents來查看一個表所占空間的大小;需要注意的是由於統計信息過時或總是持續有DML操作,所以內容是統計不准的。
第一種方式: SELECT SEGMENT_NAME TABLE_NAME ,SUM(BLOCKS) BLOCKS ,SUM(BYTES)/(1024*1024) "TABLE_SIZE[MB]" FROM USER_SEGMENTS WHERE SEGMENT_TYPE='TABLE' AND SEGMENT_NAME='你要查詢的表名' GROUP BY SEGMENT_NAME; 第二種方式: SELECT SEGMENT_NAME TABLE_NAME ,SUM(BLOCKS) BLOCKS ,SUM(BYTES)/(1024*1024) "TABLE_SIZE[MB]" FROM DBA_SEGMENTS WHERE SEGMENT_TYPE='TABLE' AND SEGMENT_NAME='你要查詢的表名' GROUP BY SEGMENT_NAME; 第三種方式: ANALYZE TABLE 用戶名.表名 COMPUTE STATISTICS; --收集表對象的統計信息 SELECT OWNER OWNER_NAME ,TABLE_NAME TABLE_NAME ,TABLESPACE_NAME TABLESPACE_NAME ,BLOCKS ACTUAL_BLOCKS ,BLOCKS + EMPTY_BLOCKS TOTAL_BLOCKS ,(BLOCKS + EMPTY_BLOCKS) * 8192/(1024*1024) "TABLE_SIZE[MB]" FROM DBA_TABLES WHERE OWNER='用戶名(大寫)' AND TABLE_NAME='表名(大寫)' 第四種方式: --注,僅表數據的大小,不含索引、分區、LOB類型 SELECT SEGMENT_NAME "表名",sum(bytes)/1024/1024 "表大小(M)" From User_Extents Group By Segment_Name having Segment_Name='你要查詢的表名';
注意:
1、通過系統視圖DBA_TABELS、USER_TABLES、USER_EXENTS統計空間大小有可能不准。
2、DBA_TABLES和DBA_SEGMENTS表中的block的區別:DBA_SEGMENTS中的blocks表示分配給表的存儲空間,而DBA_TABLES中blocks表示表中數據實際占有的存儲空間;所以這個是有細微差別的。如果要查表的實際占用大小,使用DBA_TABLES來查詢是比較准確的,但是需要先收集一下表對象的統計信息。
3、數據庫的db_block_size有所不同,不一定是8192,使用下面sql可查詢
select name,value from v$parameter where name='db_block_size';
2、查看某個用戶下各個表所占的空間:
select OWNER "用戶名", t.segment_name "表名", t.segment_type "表類型", sum(t.bytes / 1024 / 1024) "表大小M" from dba_segments t where t.owner = '你要查詢的用戶' and t.segment_type='TABLE' group by OWNER, t.segment_name, t.segment_type order by "表大小M" desc;
3、查看數據庫所有用戶下全部表所占的總空間
SELECT OWNER as "用戶名", sum(BYTES) / 1024 / 1024 as "所有表的大小(MB)" 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;
4、查詢某用戶下所有表的記錄總數:
SELECT SUM(num_rows) "記錄總條數" FROM SYS.ALL_TABLES T WHERE T.OWNER = '你要查詢的用戶';
5、查看戶下所有表的各自的記錄條數:
SELECT T.TABLE_NAME "表名",T.NUM_ROWS "記錄條數" FROM USER_TABLES T;
6、查看當前用戶下所有表的表名所屬表空間:
select table_name "表名",tablespace_name "所屬表空間" from user_tables;
7、查看當前用戶下所有表空間的使用情況:
SELECT a.tablespace_name "表空間名", total / (1024 * 1024) "表空間大小(M)", free / (1024 * 1024) "表空間剩余大小(M)", (total - free) / (1024 * 1024) "表空間使用大小(M)", round((total - free) / total, 4) * 100 "使用率 %" FROM (SELECT tablespace_name, SUM(bytes) free FROM dba_free_space GROUP BY tablespace_name) a, (SELECT tablespace_name, SUM(bytes) total FROM dba_data_files GROUP BY tablespace_name) b WHERE a.tablespace_name = b.tablespace_name;
8、查詢用戶及使用的表空間:
select username,default_tablespace from dba_users ;
9、oracle系統表
dba_tables : 系統里所有的表的信息,需要DBA權限才能查詢
all_tables : 當前用戶有權限的表的信息(只要對某個表有任何權限,即可在此視圖中看到表的相關信息)
user_tables: 當前用戶名下的表的信息