DELETE、INSERT、SELECT、または UPDATE 文を呼び出すと、サーバーは一連の実行プランを生成します。 これらの実行プランを分析した後で、サーバーは最短時間内に結果セットを返すプランを選択します。 サーバーは、いくつかの要因に基づいて計画を選択します。

  • データ処理操作の推定実行コスト。
  • postgresql.conf ファイルのクエリチューニングセクション内で割り当てられたパラメーター値。
  • ANALYZE 文によって収集された列統計。

クエリプランナーは、最も費用対効果の高いプランを選択します。 オプティマイザヒントを使用して、サーバーがクエリプランを選択するモードを設定できます。 optimizer hint には、コメントと同様の構文に埋め込まれた 1 つ以上のディレクティブが含まれます。 構文は、DELETE、INSERT、SELECT、または UPDATE 文の直後に続きます。 結果セットの生成時に、サーバーはコメント内のキーワードに基づいて特定の計画を採用または回避します。

{ DELETE | INSERT | SELECT | UPDATE } /*+ { hint [ comment ] } [...] */
 statement_body

{ DELETE | INSERT | SELECT | UPDATE } --+ { hint [ comment ] } [...]
 statement_body

Optimizer hints は、上記のいずれかの形式で含めることができます。 どちらの形式でも、コメントの開始記号である /* または -- の直後にプラス記号 (+) がなければならず、記号間にスペースが入ってはいけません。 そうしないと、サーバーは次のトークンをヒントとして解釈できません。

1 つ目の形式を使用する場合、ヒントとオプションのコメントは複数行にまたがることがあります。 2 つ目の形式では、すべてのヒントとコメントが 1 行に収まる必要があります。 残りの部分は、新しい行で始める必要があります。

  • データベースサーバーは、常に指定されたヒントを使用しようとします。
  • プランナーメソッドパラメーターが特定のプランタイプを無効にするように設定されている場合、そのプランがヒント内で指定されていても、プランナーが他のオプションを使用できない場合を除いて、使用されません。 プランナーメソッドパラメーターの例として、enable_indexscan、enable_seqscan、enable_hashjoin、enable_mergejoin、および enable_nestloop があります。 これらのパラメーターはすべて Boolean 型のパラメーターです。
  • ヒントはコメント内に埋め込まれます。 ヒントのスペルが間違っている場合、またはビュー、テーブル、列名などのヒントのパラメーターのスペルが間違っているか、SQL 文に存在しない場合、システムはエラーが発生したことを示しません。 構文エラーは指定されず、ヒント全体が無視されます。
  • SQL 文内のテーブル名またはビュー名にエイリアスが使用されている場合、ヒントでは元のオブジェクト名ではなくエイリアス名を使用する必要があります。 たとえば、SELECT /*+ FULL(acct) */ * FROM accounts acct ... という SQL 文の場合、FULL ヒント内でテーブル名の accounts ではなく、エイリアスの acct を指定する必要があります。

EXPLAIN 文を使用して、ヒントが正しく形成され、プランナーがヒントを使用しているかどうかを確認します。 EXPLAIN 文の詳細については、Oracle と互換性のある PolarDB データベースのドキュメントをご参照ください。

オプティマイザヒントは、アプリケーションの有効期間内にテーブルデータが変化する本番アプリケーションでは使用できません。 ANALYZE 文を使用して動的列が頻繁に分析されるようにするために、列統計に値の変更が反映されるように更新され、プランナーはその統計を使用して、指定された SQL 文の実行に対して最も費用対効果の高い計画を生成します。 ただし、オプティマイザヒントは、テーブルデータがどのように変更されるかに関係なく、同じプランで生成されます。

パラメーター

パラメーター 説明
hint オプティマイザヒントのディレクティブ。
comment 追加情報を含む文字列。 コメントに含めることができる文字は制限されています。 コメントには、文字、数字、アンダースコア (_)、ドル記号 ($)、番号記号 (#)、およびスペース文字のみを含めることができます。 これらの文字は、識別子の構文に準拠している必要があります。 コメントがこの形式でない場合、以降のヒントは無視されます。
statement_body DELETE、INSERT、SELECT、または UPDATE 文の残りの部分。

オプティマイザヒントのディレクティブ詳細については、次のページをご参照ください。