思路: 利用oracle本身库中自带的数据字典视图进行关联并计算实现
利用到的数据字典视图:
user_col_comments 由当前用户下所有表字段及其备注组成;
user_tab_comments 由当前用户下所有表及其备注组成;
user_tables 包含丰富的表基本信息,此次用到了其中的num_rows(非实时)字段;
user_tab_columns 包含字段相关信息,此次用到了其中的data_type,data_length;
user_extents 记录该用户默认表空间下所有的表段和索引段上的表或视图的存储信息,此次用到了其中的BYTES字段(从此视图可以看出oracle中表存放方式为段,段由连续的区组成,以表名分组对bytes字段进行求和可以得到表容量);
注:
1. 用户视图(USER_开头):这些视图仅显示当前用户所拥有的对象的信息。例如,USER_TABLES视图将显示当前用户拥有的所有表的信息。
2. 所有者视图(ALL_开头):这些视图显示了当前用户可以访问的所有对象的信息,包括当前用户拥有的对象和其他用户拥有的对象。例如,ALL_TABLES视图将显示当前用户可以访问的所有表的信息,无论这些表是属于当前用户还是其他用户。
3. 数据库管理员视图(DBA_开头):这些视图显示了数据库中所有对象的信息,而不仅仅是当前用户可以访问的对象。只有具有DBA权限的用户才能访问这些视图。例如,DBA_TABLES视图将显示数据库中所有表的信息,无论这些表是属于哪个用户。
select t.TABLE_NAME, --表名
t.COMMENTS as tab_com, --表备注
t2.COLUMN_NAME, --字段名
t2.COMMENTS, --字段备注
t3.NUM_ROWS, /*行记录数,user_tables这里的行记录数并不是实时的,是最后一次分析的时刻时表的行记录数,
表中LAST_ANALYZED字段可以看到最后一次分析时间,
我们统计真实的行记录数需要用到oracle中自带的一个过程DBMS_STATS.GATHER_TABLE_STATS对表进行分析参数设置
例如:exec dbms_stats.gather_table_stats(ownname => ' USERS ' ,tabname => ' table_name ') ;
参考自https://blog.csdn.net/liberalliushahe/article/details/80749936
*/
CASE
WHEN t4.DATA_TYPE = 'VARCHAR2' THEN
t4.DATA_TYPE || '(' || t4.DATA_LENGTH || ')'
WHEN t4.DATA_TYPE = 'NUMBER' and DATA_PRECISION is not null THEN
t4.DATA_TYPE || '(' || t4.DATA_PRECISION || ',' || t4.DATA_SCALE || ')'
ELSE
t4.DATA_TYPE
END as DATA_TYPE, --数据类型及长度是通过user_tab_columns中DATA_LENGTH, DATA_PRECISION, DATA_SCALE三个字段判断拼接组成 这里举例用了number、varchar2、date类型
t5.MB /*select SEGMENT_NAME, sum(BYTES) / 1024 / 1024 as MB from user_extents where SEGMENT_TYPE = 'TABLE' group by SEGMENT_NAME
利用user_extents中各表段的各区内存进行求和得到表容量大小,但是得到的是单位是比特,通过进制计算得到所需要的单位*/
from user_col_comments t2
join user_tab_comments t
on t.table_name = t2.table_name
join user_tables t3
on t2.table_name = t3.table_name
join user_tab_columns t4
on t2.table_name = t4.table_name
and t2.column_name = t4.column_name
join (select SEGMENT_NAME, sum(BYTES) / 1024 / 1024 as MB
from user_extents
where SEGMENT_TYPE = 'TABLE'
group by SEGMENT_NAME) t5
on t2.table_name = t5.SEGMENT_NAME;