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