web-dev-qa-db-ja.com

Postgresテーブルの統計が最新であるかどうかを知るにはどうすればよいですか?

PgAdminでは、テーブルの統計が古くなると、次のプロンプトが表示されます。

VACUUMの実行をお勧めします

テーブルschema.tableの推定行数は、実際の行数から大幅に外れています。このテーブルでVACUUMANALYZEを実行する必要があります。

Autovacuum = offでpgAdmin3とPostgres8.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タイムスタンプは常に最初の分析用です(自動バキュームフラグがオフになっていると仮定)。したがって、「実行中のVACUUM推奨」プロンプトのみを初めて表示できます。

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

このシナリオを考えると、テーブルの統計が最新であるかどうかを常に判断するにはどうすればよいですか?

20
Beibei

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

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                   |
21
Sean

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

2
atrain