芯が強い人になるESTJ-A

# 获取Oracle用户下所有的表和每张表的数据量

IT開発 Tags: 无标签 阅读: 230

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中;

一、PLSQL的概念:
PLSQL编程:procedure Language 过程语言 Oracle对SQL的一个扩展

让我们能够让像在Java当中一样写if else else if 条件,还可以编写相应的循环逻辑 for while

declare 
    -- 声明变量
    变量名 变量类型;
    变量名 变量类型 := 初始值;
    
begin
    -- 编写业务逻辑
end;

link;