查看oracle库中用户及其表的内存大小 - 融融一生

时间:2024-03-11 21:06:53

查看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: 当前用户名下的表的信息