PostgreSQL 9.1.1文書
前のページ | 巻戻し |  | 早送り | 次のページ

# ANALYZE

## 名前

ANALYZE -- データベースに関する統計を集計する

## 概要

    ANALYZE [ VERBOSE ] [ table [ ( column [, ...] ) ] ]

## 説明

`ANALYZE`はデータベース内のテーブルの内容に関する統計情報を集計し、その結果を`pg_statistic`システムテーブルに保存します。 問い合わせプランナが最も効率の良い問い合わせの実行計画を決定する際、この統計情報が使用されます。

パラメータがない場合、`ANALYZE`は現在のデータベース内の全てのテーブルを検査します。 パラメータがある場合、`ANALYZE`は指定されたテーブルのみを検査します。 さらに列名のリストを与え、その列の統計情報のみを更新することも可能です。

## パラメータ

`VERBOSE`

  進行状況の表示を有効にします。

`table`

  解析の対象とするテーブルの名前です（スキーマ修飾名も可）。 デフォルトは、現在のデータベース内の全テーブルです。

`column`

  解析の対象とする列名です。 デフォルトは全ての列です。

## 出力

`VERBOSE`が指定された場合、`ANALYZE`は進捗メッセージとして処理中のテーブルを表示します。 さらに、テーブルについての各種統計情報も表示されます。

## 注釈

デフォルトのPostgreSQLの設定では、自動バキュームデーモン（項23.1.5参照）が、データが最初にロードされた時や通常の操作を通して変更された時にテーブルの自動解析まで面倒をみます。 もし自動バキュームが無効にしているならば`ANALYZE`は定期的に、もしくは、テーブルの内容に大きな変更がある度に行うことを推奨します。 統計情報が正確であれば、プランナが最も適切な問い合わせ計画を選択できるようになります。 これによって、問い合わせ処理の速度が向上します。 VACUUMと`ANALYZE`は、1日1回、データベースがあまり使用されていない時間帯に実行するのが一般的です。

`ANALYZE`は、対象とするテーブルの読み取りロックのみを必要とします。 したがって、そのテーブルに対する他の操作と並行して実行することができます。

通常、`ANALYZE`によって集計される統計情報には、各列の典型的な値と各列のデータ分布の概要を示す度数分布が含まれます。 `ANALYZE`によってあまり意味がないとみなされた場合（例えば、一意性制約が付加された列では、典型的な値というものは存在しません）や、列のデータ型が適切な演算子をサポートしていない場合は、片方もしくは両方の情報を省略することができます。 第23章に、統計情報についての詳細が記載されています。

巨大なテーブルでは、`ANALYZE`は、全ての行を検査するのではなく、テーブルの中からランダムにサンプルを取り出して使用します。 これによって、非常に巨大なテーブルであっても短時間で解析することが可能です。 しかし、このようにして得られた統計情報はおおよそのものでしかなく、テーブルの内容に変更がなくても`ANALYZE`を実行する度に変化することに注意してください。 これにより、EXPLAINが表示する、プランナの推定コストも多少変化する可能性があります。 稀に、このような不確定要素のせいで、プランナが`ANALYZE`を実行した後に異なる問い合わせ計画を選択してしまうことがあります。 これを防止するには、以下に示すように`ANALYZE`で収集される統計情報の量を増やしてください。

default_statistics_target設定パラメータ変数を調整するか、もしくは`ALTER TABLE ... ALTER COLUMN ... SET STATISTICS`を使用して統計対象を列単位に設定し、解析を列ベースにすることで、解析の範囲を制御することができます （詳しくはALTER TABLEを参照してください）。 対象値として設定するのは、典型的な値のリストにおけるエントリ数の最大値と度数分布のビンの最大数です。 デフォルトの対象値は100です。 しかし、この値は、プランナの推定精度と`ANALYZE`の処理時間、`pg_statistic`の占める容量とのトレードオフによって変更可能です。 対象値を0に設定すると、その列に関する統計情報の集計は無効になります。 決して`WHERE`句、`GROUP BY`句、`ORDER BY`句に使用されない列に対しては、このような設定が有用です。 プランナにとってそのような列の統計情報は不要だからです。

解析する列の統計情報対象値の最大値によって、統計情報を作成するために抽出する行数が決定します。 対象値を大きくすると、比例して、`ANALYZE`に要する時間とディスク容量が増加します。

`ANALYZE`で推定される値の1つは各列に出現する個別値の個数です。 行の部分集合のみしか検査されませんので、統計情報の対象をできる限り大きくしたとしても、この推定値はかなり不正確になることが時々あり得ます。 この不正確性が問い合わせ計画を劣化させるような場合、より正確な値を手作業で求めることができ、そして、`ALTER TABLE ... ALTER COLUMN ... SET (n_distinct = ...)`でインストールすることができます（ALTER TABLE参照）。

解析中のテーブルが複数の子テーブルを持つ場合、`ANALYZE`は2回統計情報を収集します。 1回目は親テーブルのみのテーブル行を対象とし、2回目では親テーブルの行とそのすべての子テーブルの行を対象とします。 しかし自動バキュームデーモンでは、自動的に解析を行うかどうかを決定する際に親テーブル上の挿入や更新のみを考慮します。 このテーブルへの挿入や更新がほとんどなければ、継承関係に対する統計情報は手作業で`ANALYZE`を実行しない限り最新状態にはなりません。

## 互換性

標準SQLには`ANALYZE`文はありません。

## 関連項目

VACUUM, vacuumdb, 項18.4.3, 項23.1.5

前のページ | ホーム | 次のページ
ALTER VIEW | 上に戻る | BEGIN