このトピックでは、LEADINGヒントを使用してテーブル結合に複数のテーブルを指定する方法について説明します。 LEADINGヒントは、テーブルが他のテーブルに結合される前に、指定された順序でテーブルを結合するようにオプティマイザに指示します。
使用上の注意
LEADINGヒントは、ネストされたSQL文ではサポートされません。 予測できない結果の可能性を最小限に抑えるため、句にLEADINGヒントを使用しないでください。
オプティマイザが複数のテーブルの結合順序を生成すると、結合条件で構成されたテーブルが優先されます。 システムは、実行プランを生成できない場合にのみ、デカルト積を生成しようとします。 したがって、結合条件で構成された2つの隣接するテーブルにLEADINGヒントを使用すると、もう一方のテーブルの直後にある一方のテーブルが前のテーブルに結合されます。 それ以外の場合、実行計画を生成できないため、オプティマイザはLEADINGヒントを無視します。
前提条件
デフォルトでは、ヒント機能はPolarDB for PostgreSQL (Oracle互換) で有効になっています。 次のコマンドを実行して、この機能を有効にすることもできます。
set enable_hints = true;
構文
ヒント表記は
/* +
で始まり、*/
で終わります。 アスタリスク (*
) とプラス記号 (+
) の間にスペースは使用できません。ヒントは、ヒント名の後に括弧で囲まれたパラメーターで構成されます。 パラメータはスペースで区切られています。
ヒントは、SELECT、UPDATE、INSERT、MERGE、DELETEなどのキーワードのすぐ後に続く必要があります。
ヒントは大文字と小文字を区別しません。
以下の状況では、競合が存在する。 結果として、LEADINGヒントは無効になる。
依存関係のために指定されたテーブルを指定された順序で結合できない場合、LEADINGヒントは無視されます。
複数のLEADINGヒントが指定された場合、すべてのLEADINGヒントは無視されます。
ORDEREDヒントとLEADINGヒントの両方が指定されている場合、ORDEREDヒントはすべてのLEADINGヒントをオーバーライドします。
テーブルの指定された名前またはエイリアスに "s.t" などのピリオド (.) が含まれている場合、すべてのLEADINGヒントは無視されます。
LEADINGヒントがSELECT、UPDATE、INSERT、MERGE、DELETEなどのキーワードのすぐ後に続かない場合、LEADINGヒントは無視されます。
例
データベースが4つのテーブルを含むと仮定する。 テーブルの名前またはエイリアスは、a、b、c、およびdです。 各テーブルは別のテーブルに結合できます。
有効な構文
例
可能な参加
/* + リーディング (a) * /
(((a b) c) d) 、(((a b) d) c) 、(((a c) b) d) 、(((a c) d) b) 、(((a d) b) c) 、(((a c) c) b)
/* + リーディング (a b) * /
(((a b) c) d), (((a b) d) c)
/* + リーディング (a b c) * /
(((a b) c) d)
/* + リーディング (a b c d) * /
(((a b) c) d)
説明((a b) c)
は、a、b、およびc
の昇順で結合優先度を指定します。(c (a b))
は、c、a、b
の昇順で結合優先度を指定します。無効な構文
例:
/* + リーディング (a) * /
/* + leading(a b) leading(a b) * /
/* + リーディング (a b a) * /
/* + leading(a b) leading(a)* /
/* + leading(a b) leading(c d) * /
/* + リーディング (a b e) * /
* + leading(a b) leading(a c) * /
/* + leading() * /
説明データベースには、名前またはエイリアスがeであるテーブルが含まれていません。