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でも良さそう。

■同じタグの記事(最新5件)
PostgreSQLでUPSERTを試してみる。
■同じタグの記事を見る