ANALYZE は PostgreSQL テーブルの内容に関する統計情報を集計し、その結果を pg_statistic システムテーブルに保存します。その後、問い合わせプランナはその統計情報を、最も効率の良い問い合わせの実行計画を決定する際に使用します。
パラメータがない場合、ANALYZE は現在のデータベース内の全てのテーブルを検査します。パラメータがある場合、ANALYZE はそのテーブルのみを検査します。更に列名のリストを与え、その列の統計情報のみを更新することも可能です。
ANALYZEを定期的に、もしくは、テーブルの内容に大きな変更があった後に行なうことを推奨します。正確な統計情報により、プランナが最も適切な問い合わせ計画を選択できるようになります。従って、問い合わせ処理の速度が向上します。VACUUM と ANALYZE の実行について良く使用される方法は、1日1回、あまり使用されていない時間帯に実行することです。
VACUUM FULL とは異なり、ANALYZE は、対象とするテーブルの読み取りロックのみを必要とします。ですので、そのテーブルに対する他の操作と並行して実行することができます。
巨大なテーブルでは、ANALYZE は、全ての行を検査するのではなくテーブルの中からランダムにサンプルを取り出します。これにより、非常に巨大なテーブルの解析も短い時間で終ります。しかし、その統計情報はおおよそのものでしかなく、テーブルの内容に変更がなくても ANALYZE を実行する度に変更されてしまうことに注意して下さい。これにより、 EXPLAIN が表示する、プランナの推定コストが多少異なることになります。
通常、集計された統計情報は各列の典型的な値と各列のデータ分布の概要を示す度数分布です。ANALYZE があまり意味がないとみなした場合 (例えば、一意性制約キーの列では、典型的な値はありません。) や列のデータ型が適切な演算子をサポートしていない場合は、片方もしくは両方とも省略されてしまう可能性があります。ユーザガイド には、この統計情報についてのもっと多くの情報が記載されています。
ALTER TABLE ALTER COLUMN SET STATISTICS を使用して列単位の統計対象を調整することで、解析の範囲を制御することができます。( ALTER TABLE を参照して下さい。)この対象値は典型的な値一覧のエントリ数の最大値と度数分布のビンの最大数 を設定します。デフォルトの対象値は 10 です。しかし、プランナの推定精度とANALYZE の処理時間と pg_statistic の占める容量とのトレードオフによって増減させることができます。特に対象値を 0 に設定すると、その列に関する統計情報の集計は無効になります。その列が決して 問い合わせの WHERE、GROUP BY、ORDER BY 句に使用されない場合はこれは有用です。プランナはそのような列の統計情報を使用しないからです。
解析される列内の統計情報対象値の最大値によって、統計情報を作成するために抽出するテーブルの行の数を決定します。その対象を増加させることは、比例的に、 ANALYZE に必要とされる時間と容量を増加させます。