查看oracle庫中用戶及其表的內存大小


某天小白我接到一個小小的一句話的任務,讓我把目前項目的數據庫所有表的大小統計下,其實這種操作對於你們大多數人可能都是隨手拈來的事,但是我不行,所有就為自己做了一個簡單記錄。基本都百度上的,有問題之處請不吝賜教!!!

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: 當前用戶名下的表的信息


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM