PostgreSQLのテーブルカウント更新(VACUUM)

2019.12.18 (水)

とにかく、いろんな局面でVACUUMするのがPostgreSQL。

=> select relname, n_live_tup from pg_stat_user_tables where schemaname='public' order by relname;

で、全テーブルのレコード数をカウントできますが、なんかキャッシュされます。truncateしても、このSQL文で出力した内容が更新されない。pg_stat_user_tablesを更新しないといけないらしい。たぶん統計情報として何かしらのキャッシュをもっているのだと思う。

=> truncate table SAMPLE_TABLE;
=> select count(*) from SAMPLE_TABLE;
 count
-------
     0

なのに、

=> select relname, n_live_tup from SAMPLE_TABLE where schemaname='public' order by relname;
            relname             | n_live_tup
--------------------------------+------------
 SAMPLE_TABLE                   |      89248

ということで削除したレコードが反映されない。
VACUUMします。

=> VACUUM SAMPLE_TABLE;

確認します。

=> select relname, n_live_tup from SAMPLE_TABLE where schemaname='public' order by relname;
            relname             | n_live_tup
--------------------------------+------------
 SAMPLE_TABLE                   |      0
SELECT
    relname, n_live_tup, n_dead_tup, round(n_dead_tup*100/n_live_tup,2) AS ratio
FROM
    pg_stat_user_tables WHERE relname = 'テーブル名';