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