关于获取数据库表数据量的一段小脚本

2022-03-11 15:45:02 浏览数 (2)

周末接到个小任务,要求把各系统的数据量和主键情况统计出来,其实最快的办法是登到各个系统里去查,比较棘手的事情,是各业务系统厂家一来比较分散,二来也不太合作,所以干脆找DBA好了,DBA那边呢又对业务系统的schema和表名不熟,所以扯来扯去,不如自己动手干好了。

一个系统里表的数量有上万张,关于表数据量统计的办法也有好多种,近似的数据量统计可以取segment表,最准的当然是直接count表了;取数据的办法也有多种,可以拼出来select 'tabname',count(*) from tablename union all select 'tabname',count(*) from tablename,也可以拼出来insert into logtable select 'tabname',count(*) from tablename;最佳的办法莫过于写个存储过程,过程里写个动态游标,把各个表的统计数据写入一个表,最后直接读取这个表的结果,不过有点啰嗦,好久不写有点手生;还是用了另外一种稍微简单的办法,直接拼成一张可以直接执行的sql文件,在数据库里执行得了。

代码本身没啥技术含量,加上公众号好久没写了,暂且贴出来。

代码示例

代码语言:javascript复制
--获取表记录数
select c.sqltext
  from (
           select 'spool to shengchanrecords.log;' sqltext,1 rownums from dual
           union all
           select 'set head off;' sqltext,2 rownums from dual
           union all
           select b.sqltext,rownum 2 rownums
           from (
                   select 'select '''||a.owner||''' schemaname,'''||a.table_name||''' tablename,count(*) from '||a.owner||'.'||a.table_name||';' sqltext
                     from all_tables a
                    where a.owner in ('','') 
                    order by a.owner,a.table_name
                    ) b
           union all
           select 'spool off;' sqltext,100000 rownums from dual
       ) c
 order by c.rownums;
--获取表主键情况
spool to shengchanprimarykey.log;
select a.owner,a.table_name,
        case when b.constraint_type='P' then 'Y' else 'N' end isprimarykey
  from all_tables a
  left outer join all_constraints b
    on a.owner=b.owner and a.table_name=b.table_name and b.constraint_type='P'
 where where a.owner in ('','') 
  order by a.owner,a.table_name;
spool off;

0 人点赞