1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

全テーブルの件数確認

Last updated at Posted at 2021-04-13

全テーブルの件数確認

たくさんのテーブルのデータ件数をいちいち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'
)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?