kotememo

【PostgreSQL】統計情報の最終更新時刻を確認する

はじめに

普段は数秒で完了するクエリが突然数分レベルで極端に遅くなった時に、直前にautoanalyzeされていないか調査することがあります。

もしクエリ性能が悪くなる直前にautoanalyzeされている場合は、暫定対応として手動でanalyzeしてみると解消する場合があります。

概要

  1. 統計情報コレクタpg_stat_user_tablesビュー
    autovacuum、autoanalyzeの最終更新時刻を取得

環境

  • PostgreSQL 14.6

1. 統計情報コレクタpg_stat_user_tablesビュー

PostgreSQLデータベース上に用意されているpg_stat_user(all)_tablesビューでvacuumやanalyzeされた最終更新時刻を確認することができます。

--統計情報の最終更新時刻
select
    schemaname    --スキーマ名
    , relname     --テーブル名
    , n_live_tup    --有効レコード行の推定値
    , n_dead_tup    --不要レコード行の推定値
    , pg_stat_user_tables.last_vacuum    --手動vacuum最終時刻
    , pg_stat_user_tables.last_autovacuum    --自動vacuum最終時刻
    , pg_stat_user_tables.last_analyze    --手動analyze最終時刻
    , pg_stat_user_tables.last_autoanalyze    --自動analyze最終時刻
from
    pg_stat_user_tables
-- where
--     relname = 'テーブル名'
;

データベースが自動でautoanalyzeすることでクエリの実行計画が悪化してしまい、クエリ性能が突然悪化することがあります。

手動で関連テーブルをanalyzeしてみて解消された場合はautoanalyzeが原因と考えられます。

ただし根本原因としてはテーブルのインデックスの設定が悪かったり、SQLのテーブル結合に不足があってインデックスが適切に使用されないことだと思われます。

そのため、最終的にはインデックスの確認やSQLチューニングをする必要があると思います。