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