Oracle查询当前用户下的表和所有表的数据量

​ 因为数据迁移,数据量较多,且还在使用中,所以想分批把表给迁移过去,统计下没张表是干什么的,以及表中的数据量,表是直接可以通过下面的SQL进行统计的:

select table_name from user_tables;

​ 这样就获取到了当前用户下所有的数据表了,但是一个问题,就是还要获取到每张表中的数据量;当然,有些朋友也会说通过下面这个SQL来获取到数据量啊;

select num_rows from user_tables;

​ 细心的朋友,可以通过下面的SQL和上面的SQL查询出的数据量对比下,你会发现,差了好多哦~

select count(*) from us_tables;

​ 主要原因是:num_rows字段的值是在最后一次收集统计信息之后更新的,如果是频繁变化(批量变化)的表,这个字段的值极为不准确,如果数据量变化不频繁,这个字段的值也只是个大概数。也就是说num_rows只是一个粗略的计算,所以他的计算速度比较快,而count(*)计算的比较仔细,速度也会有所下降;

​ 当然,想要用num_rows也不是不可以的,但是这个方法比较适合表少的,用下面这个SQL来对表进行一个详细的统计

analyze table  us_tables compute statistics;

​ 但是,我的数据表比较多,计算下,大概有五百多张表,不能一个一个统计统计吧,想着一步到位,就用plsql写了一个代码块,来进行循环统计,如下:

declare
  v_num varchar2(200);
  v_sql varchar2(500);
begin
  for tab in (select table_name as tableName from user_tables)
    loop
      v_sql := 'select count(*) from ' || tab.tableName;
      execute immediate v_sql into v_num;
      dbms_output.put_line(tab.tableName || ',' || v_num);
    end loop;
end;

​ 这样就能统计出每张表中的数据量了,有需要的,可以将输出的信息复制到文本文档里面,表名和数据量是通过,来分割的,可以直接将文本文档信息导入到Excel中;

以上只是我个人的想法,各位朋友有什么更好的方法,欢迎在下面留言交流~

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐