周末接到个小任务,要求把各系统的数据量和主键情况统计出来,其实最快的办法是登到各个系统里去查,比较棘手的事情,是各业务系统厂家一来比较分散,二来也不太合作,所以干脆找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;