全テーブルの件数確認
たくさんのテーブルのデータ件数をいちいちCOUNT(*)で取得していられない。
テーブル名を抜き出して、Excelなんかに式を入力して
SELECT COUNT(*) FROM TABLE_NAME;
なんかを書き出してコピペしてみたりしていたけど、
そもそもそれぞれに細かい件数が知りたいわけじゃない。
データ移行などの前にどのテーブルにどのくらいのデータがあるのか、おおよその件数を知りたいくらいの場合にはシステムテーブルで統計情報を取得した時点の件数を持っている。
日次に夜間に統計情報を取っていたりするならこれで十分な場合も多い。
SELECT
ROW_NUMBER() OVER(ORDER BY A.TABLE_NAME) AS NO
,A.TABLE_NAME
,B.COMMENTS
,A.NUM_ROWS
,A.AVG_ROW_LEN
,A.SAMPLE_SIZE
,A.LAST_ANALYZED
,SYSDATE
FROM ALL_TAB_STATISTICS A,ALL_TAB_COMMENTS B
WHERE A.TABLE_NAME = B.TABLE_NAME
AND A.OWNER = B.OWNER
ORDER BY A.TABLE_NAME
でもやっぱりちゃんと細かい件数が必要な場合もある。
って場合はここにいいのがあった。
http://d.hatena.ne.jp/yohei-a/20101112/1289587201
これを参考に両方出してみる
SELECT
ROW_NUMBER() OVER(ORDER BY A.TABLE_NAME) AS NO
,A.TABLE_NAME
,B.COMMENTS
,TO_NUMBER(
EXTRACTVALUE(
XMLTYPE(
DBMS_XMLGEN.GETXML('SELECT COUNT(*) C FROM '||A.OWNER||'.'||A.TABLE_NAME))
,'/ROWSET/ROW/C')) AS COUNT
,A.NUM_ROWS
,A.AVG_ROW_LEN
,A.SAMPLE_SIZE
,A.LAST_ANALYZED
,SYSDATE
FROM ALL_TAB_STATISTICS A,ALL_TAB_COMMENTS B
WHERE A.TABLE_NAME = B.TABLE_NAME
AND A.OWNER = B.OWNER
ORDER BY A.TABLE_NAME
でも結局全テーブルにCount(*)やっているわけで、件数が多いテーブルがいくつもあるとかなり時間がかかってしまう。
その場合は、その場で統計情報を取り直してから前のSQLでやったほうがいいかもしれない。
統計情報更新
DBMS_STATS.GATHER_SCHEMA_STATS (
OWNNAME => USER
,OPTIONS => 'GATHER AUTO'
)