正確に件数を取得する際には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でも良さそう。