ablog

不器用で落着きのない技術者のメモ

ログインユーザが所有するテーブル一覧とその行数を取得するPL/SQL

Oracleでログインユーザが所有するテーブル一覧とその行数を取得するPL/SQLを作ってみた。

  • table_count.sql
set echo off
set heading off
set pagesize 0
set linesize 10000
set trimout on
set trimspool on
set feedback off

set serveroutput on size 1000000

col spool_file_name new_value spool_file_name for a100
select lower(username)||'_table_count_'|| to_char(sysdate,'YYYYMMDDHH24MISS') || '.csv' spool_file_name from user_users;

spool &spool_file_name
declare
        cursor cu is select segment_name from user_segments where segment_type = 'TABLE';
        sql_stmt varchar2(200);
        cnt number(20);
begin
        for rec in cu loop
                sql_stmt := 'select count(ROWID) from '||rec.segment_name;
                execute immediate sql_stmt into cnt;
                dbms_output.put_line(rec.segment_name||','||cnt);
        end loop;
end;
/
spool off

exit

実行してみるとこんな感じ。

$ sqlplus system/manager @table_count.sql
$ head -3 system_table_count_20090630135106.csv
LOGSTDBY$SKIP_SUPPORT,74
MVIEW$_ADV_WORKLOAD,0
MVIEW$_ADV_BASETABLE,0

system_table_count_20090630135106.csv にsystemユーザの全テーブルの行数が出力されている。
行数が多い順にソートしてみる。

$ sort -r -t, +1 system_table_count_20090630135106.csv > sorted.csv
$ head -3 sorted.csv
HELP,918
LOGSTDBY$SKIP_SUPPORT,74
MVIEW$_ADV_PARAMETERS,40