25

pgAdmin では、テーブルの統計が古くなっている場合は常に、プロンプトが表示されます。

VACUUM の実行を推奨

テーブル schema.table の推定行数は、実際の行数とは大幅に異なります。このテーブルで VACUUM ANALYZE を実行する必要があります。

autovacuum=off で pgAdmin 3 と Postgres 8.4.4 を使用してテストしました。変更されたテーブルをクリックすると、すぐにプロンプ​​トが表示されます。

Java で Web ベースのシステムを作成しているとしましょう。pgAdmin のようなプロンプトを表示できるように、テーブルが古くなっているかどうかを検出するにはどうすればよいですか?

私のアプリケーションの性質上、従わなければならないいくつかのルールがあります。

  1. pg_stats と pg_statistic の特定のテーブルの統計が最新かどうかを知りたいです。

  2. postgresql.conf で autovacuum フラグを設定できません。(つまり、自動バキューム フラグはオンまたはオフにすることができます。私はそれを制御できません。自動バキューム フラグがオンかオフか、統計が最新かどうかを確認する必要があります。)

  3. 毎回バキューム/分析を実行して最新にすることはできません。

  4. ユーザーがテーブルを選択したときに、pg_stats と pg_statistic に反映されていない更新 (ドロップ、挿入、更新など) がこのテーブルにある場合、テーブルが古くなっていることを示すプロンプトを表示する必要があります。

pg_catalog.pg_stat_all_tables のタイムスタンプを解析することでは実現不可能のようです。もちろん、テーブルが以前に分析されていない場合は、last_analyze にタイムスタンプがあるかどうかをチェックして、テーブルが最新かどうかを調べることができます。ただし、この方法を使用すると、既にタイムスタンプがある場合、テーブルが最新かどうかを検出できません。つまり、テーブルに追加する行数に関係なく、pg_stat_all_tables の last_analyze タイムスタンプは常に最初の分析用です (autovacuum フラグがオフであると仮定します)。そのため、「Running VACUUM recommended」プロンプトは初回のみ表示できます。

また、last_analyze タイムスタンプを現在のタイムスタンプと比較することもできません。何日もテーブルが更新されない可能性があります。そして、1 時間に大量の更新が行われる可能性があります。

このシナリオでは、テーブルの統計が最新かどうかを常に確認するにはどうすればよいでしょうか?

4

2 に答える 2

33

システムカタログを確認してください。

test=# SELECT schemaname, relname, last_analyze FROM pg_stat_all_tables WHERE relname = 'city';
 schemaname | relname |         last_analyze          
------------+---------+-------------------------------
 pagila     | city    | 2011-07-26 19:30:59.357898-07
 world      | city    | 2011-07-26 19:30:53.119366-07
(2 rows)

そこにはあらゆる種類の有用な情報があります:

test=# \d pg_stat_all_tables           View "pg_catalog.pg_stat_all_tables"
      Column       |           Type           | Modifiers 
-------------------+--------------------------+-----------
 relid             | oid                      | 
 schemaname        | name                     | 
 relname           | name                     | 
 seq_scan          | bigint                   | 
 seq_tup_read      | bigint                   | 
 idx_scan          | bigint                   | 
 idx_tup_fetch     | bigint                   | 
 n_tup_ins         | bigint                   | 
 n_tup_upd         | bigint                   | 
 n_tup_del         | bigint                   | 
 n_tup_hot_upd     | bigint                   | 
 n_live_tup        | bigint                   | 
 n_dead_tup        | bigint                   | 
 last_vacuum       | timestamp with time zone | 
 last_autovacuum   | timestamp with time zone | 
 last_analyze      | timestamp with time zone | 
 last_autoanalyze  | timestamp with time zone | 
 vacuum_count      | bigint                   | 
 autovacuum_count  | bigint                   | 
 analyze_count     | bigint                   | 
 autoanalyze_count | bigint                   |
于 2011-08-01T21:23:10.283 に答える
4

アプリケーションでの vac'ing について心配する必要はありません。代わりに、autovacサーバーでプロセスを構成する必要があります ( をpostgresql.conf参照)。サーバーは、独自の内部統計に基づいて処理を行いますVACCUMANALYZE実行する頻度と、処理するしきい値変数を構成できます。

于 2011-08-01T20:59:22.483 に答える