DELETE、INSERT、SELECT、またはUPDATEステートメントを実行すると、PolarDB for PostgreSQL (Compatible with Oracle) によって一連の実行プランが生成されます。 PolarDB for PostgreSQL (Compatible with Oracle) は、これらの実行プランを分析し、最小時間内に結果セットを返すことができる実行プランを選択します。
PolarDB for PostgreSQL (Oracleと互換) は、次の要因に基づいて実行プランを選択します。
データ処理の推定実行コスト
postgresql.confファイルの [クエリチューニング] セクションのパラメーターに割り当てられている値
ANALYZEステートメントによって収集される列統計
ほとんどの場合、PolarDB for PostgreSQL (Compatible with Oracle) は、最も少ないリソースを消費する実行プランを選択します。 オプティマイザーヒントを使用して選択に影響を与えることができます。
オプティマイザーヒントは、DELETE、INSERT、SELECT、またはUPDATEステートメントの直後に続くディレクティブです。 オプティマイザーヒントは、コメントに似た構文に埋め込まれます。 PolarDB for PostgreSQL (Compatible with Oracle) が結果セットを生成すると、PolarDB O Editionはコメントのキーワードに基づいて特定の実行プランを選択または回避します。
構文
Optimizerヒントは、次のいずれかの形式で含めることができます。
{ DELETE | INSERT | SELECT | UPDATE } /*+ { hint [ comment ] } [...] */
statement_body
{ DELETE | INSERT | SELECT | UPDATE } --+ { hint [ comment ] } [...]
statement_body
プラス記号 (+) は、/* または -- openingコメント記号のすぐ後に続く必要があります。 プラス記号 (+) と開始コメント記号の間にスペース文字がないことを確認してください。 それ以外の場合、PolarDB O Editionは対応するコンテンツをヒントとして解釈できません。
上記の2つの形式では、ヒントとコメントの表示方法が異なります。 最初の形式では、ヒントとコメントは複数の行にまたがることができます。 2番目の形式では、ヒントとコメントを1行に配置する必要があります。 ただし、どちらの形式でも、statement_body部分は新しい行で開始する必要があります。
ヒントの形式が有効であることを確認するには、EXPLAINステートメントと一緒にヒントを使用することをお勧めします。
パラメーター
パラメーター | 説明 |
hint | オプティマイザヒントのディレクティブ。 |
comment | 追加情報を含む文字列。 コメントに含めることができる文字は限られています。 ほとんどの場合、コメントには、文字、数字、アンダースコア (_) 、ドル記号 ($) 、数字記号 (#) 、およびスペース文字のみを使用できます。 これらの文字は、識別子の構文に準拠している必要があります。 コメントがこれらの要件を満たさない場合、PolarDB O Editionは後続のヒントを無視します。 |
statement_body | DELETE、INSERT、SELECT、または UPDATE 文の残りの部分。 |
追加の考慮事項
プランの種類を無効にするようにプランナーメソッドパラメーターを設定した場合、ヒントで実行プランが指定されているかどうかに関係なく、この種類の実行プランは使用されません。 この場合、実行プランは、他の実行プランが利用可能でない場合にのみ使用されます。 次のパラメーターは、プランナーメソッドパラメーターの例です。enable_indexscan、enable_seqscan、enable_hashjoin、enable_mergejoin、およびenable_nestloop。 これらのパラメータはすべてブール型である。
ヒントはコメントに埋め込まれています。 ヒントのスペルが間違っているか、ビュー、テーブル、列名などのヒントのパラメーターのスペルが間違っているか、SQL文に存在しない場合、システムは構文エラーを促しません。 システムはヒント全体を無視するだけです。
エイリアスがSQL文のテーブル名またはビュー名として使用されている場合は、元のオブジェクト名ではなくエイリアス名をヒントに使用する必要があります。 たとえば、
SELECT /* + FULL(acct) */ * FROM accounts acct ..., acct
ステートメントでは、FULLヒントのテーブル名アカウントの代わりにエイリアスacctを指定する必要があります。運用環境ではテーブルデータが頻繁に変更されるため、運用環境ではオプティマイザーヒントを使用しないことをお勧めします。
オプティマイザーヒントの詳細については、次のトピックを参照してください。