すべてのプロダクト
Search
ドキュメントセンター

PolarDB:ANALYZE

最終更新日:May 30, 2024

ANALYZEは、データベース内のテーブルの内容に関する統計を収集し、結果をpg_statisticシステムカタログに保存します。

説明

ANALYZEは、データベース内のテーブルの内容に関する統計を収集し、結果をpg_statisticシステムカタログに保存します。 その後、クエリプランナーはこれらの統計を使用して、クエリの最も効率的な実行プランを決定します。

table_and_columnsリストがない場合、ANALYZEは、現在のユーザーが分析する権限を持つ現在のデータベース内のすべてのテーブルとマテリアライズドビューを処理します。 リストでは、ANALYZEはそれらのテーブルのみを処理します。 さらに、テーブルの列名のリストを与えることも可能であり、その場合、それらの列の統計のみが収集される。

オプションリストが括弧で囲まれている場合、オプションは任意の順序で記述できます。

概要

ANALYZE [ ( option [, ...] ) ] [table_and_columns [, ...] ]
ANALYZE [ VERBOSE ] [ table_and_columns [, ...] ]

ここで、オプションは次のいずれかになります。

    VERBOSE [ブール値]
    SKIP_LOCKED [ブール値]

table_and_columnsは次のとおりです。

    table_name [ ( column_name [, ...] ) ] 

パラメーター

  • VERBOSE: 進行状況メッセージの表示を有効にします。

  • SKIP_LOCKED: 関係の作業を開始するときに、競合するロックが解放されるのをANALYZEが待機しないように指定します。待機せずに関係をすぐにロックできない場合、関係はスキップされます。 このオプションを使用しても、関係のインデックスを開くとき、またはパーティション、テーブル継承子、および一部の種類の外部テーブルからサンプル行を取得するときに、ANALYZEがブロックされる可能性があることに注意してください。 また、ANALYZEは通常、指定されたパーティションテーブルのすべてのパーティションを処理しますが、パーティションテーブルに競合するロックがある場合、このオプションを使用すると、ANALYZEはすべてのパーティションをスキップします。

  • boolean: 選択したオプションをオンにするかオフにするかを指定します。 オプションを有効にするにはTRUEON、または1と記述し、オプションを無効にするにはFALSEOFF、または0と記述します。 ブール値は省略することもでき、その場合はTRUEと仮定される。

  • table_name: 分析する特定のテーブルの名前 (おそらくスキーマ修飾) 。 省略した場合、現在のデータベース内のすべての通常テーブル、パーティション分割テーブル、およびマテリアライズドビューが分析されます (ただし、外部テーブルは分析されません) 。 指定されたテーブルがパーティションテーブルの場合、パーティションテーブル全体の継承統計と個々のパーティションの統計の両方が更新されます。

  • column_name: 分析する特定の列の名前。 デフォルトはすべての列になります。

出力

VERBOSEを指定すると、ANALYZEは現在処理中のテーブルを示す進捗メッセージを出力します。 テーブルに関するさまざまな統計も印刷されています。

テーブルを分析するには、通常、テーブルの所有者またはスーパーユーザーである必要があります。 ただし、データベース所有者は、共有カタログを除くデータベース内のすべてのテーブルを分析できます。 (共有カタログの制限は、真のデータベース全体のANALYZEがスーパーユーザーによってのみ実行できることを意味します。) ANALYZEは、呼び出し元のユーザーに分析権限がないテーブルをスキップします。

外部テーブルは、明示的に選択された場合にのみ分析されます。 すべての外国のデータラッパーがANALYZEをサポートしていません。 テーブルのラッパーがANALYZEをサポートしていない場合、コマンドは警告を出力し、何もしません。

デフォルトのPostgreSQL構成では、自動真空デーモン (seeSection 25.1.6) は、最初にデータがロードされたとき、および通常の操作中にテーブルが変更されるときに、テーブルの自動分析を処理します。 自動真空が無効になっている場合は、ANALYZEを定期的に実行するか、テーブルの内容を大幅に変更した直後に実行することをお勧めします。 正確な統計は、プランナーが最も適切なクエリプランを選択するのに役立ち、クエリ処理の速度を向上させます。 ほとんど読み取り可能なデータベースの一般的な戦略は、使用率の低い時間帯にVACUUMとANALYZEを1日1回実行することです。 (重い更新アクティビティがある場合、これでは十分ではありません。)

ANALYZEでは、ターゲットテーブルの読み取りロックのみが必要なため、テーブルの他のアクティビティと並行して実行できます。

ANALYZEによって収集された統計には、通常、各列の最も一般的な値のリストと、各列のおおよそのデータ分布を示すヒストグラムが含まれます。 ANALYZEが重要でないと判断した場合 (たとえば、一意キー列では共通値がない場合) 、または列データ型が適切な演算子をサポートしていない場合は、これらの一方または両方を省略できます。

大きなテーブルの場合、ANALYZEはすべての行を調べるのではなく、テーブルの内容のランダムサンプルを取得します。 これにより、非常に大きなテーブルでも短時間で分析することができます。 ただし、統計は近似値にすぎず、実際のテーブルの内容が変化しなかった場合でも、ANALYZEが実行されるたびにわずかに変化します。 これにより、EXPLAINで示されるプランナーの推定コストに小さな変化が生じる可能性があります。 まれな状況では、この非決定論により、ANALYZEの実行後にプランナーのクエリプランの選択が変更されます。 これを回避するには、以下で説明するように、ANALYZEによって収集される統計量を増やします。

分析の範囲は、default_statistics_target設定変数を調整することで制御できます。または、ALTER TABLEを使用して列ごとの統計ターゲットを設定することで、列ごとに制御できます。 ALTER COLUMN... 統計を設定します。 目標値は、最も一般的な値のリストにおけるエントリの最大数およびヒストグラムにおけるビンの最大数を設定する。 デフォルトの目標値は100ですが、これを上下に調整して、ANALYZEにかかる時間とinpg_statisticに占有されるスペースの量とのトレードオフを行うことができます。 特に、統計ターゲットをゼロに設定すると、その列の統計の収集が無効になります。 これは、クエリのWHERE、GROUP BY、またはORDER BY句の一部として使用されない列の場合に役立ちます。これは、プランナーがそのような列の統計情報を使用しないためです。

分析される列の中で最大の統計ターゲットは、統計を準備するためにサンプリングされるテーブル行の数を決定します。 ターゲットを増やすと、分析を行うのに必要な時間とスペースが比例して増加します。

ANALYZEによって推定される値の1つは、各列に現れる別個の値の数である。 行のサブセットのみが検査されるので、この推定は、可能な限り最大の統計ターゲットであっても、かなり不正確になることがある。 この不正確さが悪いクエリプランにつながる場合、より正確な値を手動で決定し、ALTER TABLE... ALTER COLUMN... SET (n_distinct = ...)

分析対象のテーブルに継承子がある場合、ANALYZEは2つの統計セットを収集します。1つは親テーブルの行のみで、もう1つは親テーブルとそのすべての子の両方の行を含みます。 この2番目の統計セットは、継承ツリー全体を処理するクエリを計画するときに必要です。 この場合、子テーブル自体は個別に分析されません。 ただし、自動真空デーモンは、そのテーブルの自動分析をトリガーするかどうかを決定するときに、親テーブル自体の挿入または更新のみを考慮します。 そのテーブルがめったに挿入または更新されない場合、手動でANALYZEを実行しない限り、継承統計は最新にはなりません。

子テーブルまたはパーティションが外部データラッパーがANALYZEをサポートしていない外部テーブルである場合、継承統計を収集する間、それらのテーブルは無視されます。

分析されているテーブルが完全に空の場合、ANALYZEはそのテーブルの新しい統計を記録しません。 既存の統計はすべて保持されます。