ちょっとした技術メモを忘れないうちに書いていく

PostgreSQLで全テーブルの件数を取得する

2021-01-28

大体でいいんだよって時に


正確に件数を取得する際には COUNT 関数を使う必要があるけど、統計情報(pg_stat_user_tables )から全件取得することができる。

テスト用テーブルを作成

テスト用にこんな感じのテーブルとデータ(10000 件)を入れておく。

--テーブル作成
create table number_test (
  id integer not null
  , value text not null
  , primary key (id)
);
--テストデータ登録
INSERT INTO number_test(id,"value") VALUES (1,'1');
INSERT INTO number_test(id,"value") VALUES (2,'2');
-- ・・・10000まで連番で入れておく
INSERT INTO number_test(id,"value") VALUES (10000,'10000');

--テーブル作成
create table string_test (
  id integer not null
  , value text not null
  , primary key (id)
);
--テストデータ登録
INSERT INTO string_test(id,"value") VALUES (1,'A');
INSERT INTO string_test(id,"value") VALUES (2,'B');
-- ・・・10000まで連番で入れておく
INSERT INTO string_test(id,"value") VALUES (10000,'P');

件数を取得する

COUNT 関数で取得する

SELECT COUNT(0) FROM number_test;
--count
10000

SELECT COUNT(0) FROM string_test;
--count
10000

統計情報(pg_stat_user_tables)から取得する

SELECT relname, n_live_tup FROM pg_stat_user_tables WHERE schemaname='public';

--relname	n_live_tup(件数)
number_test	10000
string_test	10000

件数が合わない場合

TRANCATE,INSERT など実施した後に統計情報が更新されていないと件数が合わなくなる場合がある。 下記では、number_test に 10000 件登録されていて COUNT 関数ではちゃんと 10000 件取得できているのに、pg_stat_user_tables では 9962 件となってしまっている。

SELECT COUNT(0) FROM number_test;
--count
10000

SELECT relname, n_live_tup FROM pg_stat_user_tables WHERE relname='number_test';
--relname	n_live_tup
number_test	9962

ANALYZE で統計情報を更新。

ANALYZE number_test;

SELECT relname, n_live_tup FROM pg_stat_user_tables WHERE relname='number_test';
--relname	n_live_tup
number_test	10000

10000 件となることを確認。 ANALYZE ではなく VACUUM でも良さそう。


目次