Oracle DB の全テーブルのレコード数を求める SQL

Oracle には「データディクショナリ」と呼ばれる参照表があり、ユーザやテーブルに関する色々を SQL で検索できる。

例えば SELECT TABLE_NAME FROM USER_TABLES; とすると、Oracle DB にログインしているユーザスキーマの中にある全テーブル名の一覧を SQL で取得できる。今回はこの SQL を拡張して、ユーザが持つ全テーブルのレコード数を求めてみる。

SELECT
    TABLE_NAME,
    TO_NUMBER(
      EXTRACTVALUE(
        XMLTYPE(
          DBMS_XMLGEN.GETXML(
            'SELECT COUNT(*) C FROM ' || TABLE_NAME
          )
        )
        , '/ROWSET/ROW/C'
      )
    ) CNT
FROM
    USER_TABLES
WHERE
    TABLE_NAME NOT LIKE 'BIN$%'
ORDER BY
    TABLE_NAME;

XML で SQL 文の結果を受け取っている。そのためか実行には若干時間がかかる。WHERE 句ではリサイクル・ビンのテーブルを除外するようにしている。