SQLクエリにおいて、コスト推定に関連するHintは、オプティマイザーが特定の状況下で特定のクエリ変換(クエリ構造の書き換え、ビューのメジャーコンパクションまたはマイナーコンパクションなど)を採用または回避するよう指示します。
ヒントタイプ |
説明 |
|---|---|
COALESCE_SQ |
クエリ内のサブクエリに対する結合書き換えを指定します。逆操作は NO_COALESCE_SQ です。 |
NO_COALESCE_SQ |
サブクエリの結合によるクエリ書き換えを禁止します。逆操作は COALESCE_SQ です。 |
MERGE |
ビューの結合を許可します。逆操作は NO_MERGE です。 |
NO_MERGE |
外部クエリと任意のインラインビュークエリを単一クエリに結合することを禁止します。逆操作は MERGE です。 |
NO_EXPAND |
OR 条件を含む WHERE 句に対するクエリ展開書き換えを禁止します。逆操作は USE_CONCAT です。 |
USE_CONCAT |
OR 条件を含む WHERE 句に対するクエリ展開書き換えを有効にします。逆操作は NO_EXPAND です。 |
PLACE_GROUP_BY |
Group By のダウンプッシュクエリ書き換えを有効にします。逆操作は NO/place_GROUP_BY です。 |
NO_PLACE_GROUP_BY |
Group By のダウンプッシュクエリ書き換えを無効にします。逆操作は PLACE_GROUP_BY です。 |
SEMI_TO_INNER |
EXISTSまたはINを含むセミ結合クエリを最適化し、それらを内部結合クエリに変換します。逆操作は NO_SEMI_TO_INNER です。 |
NO_SEMI_TO_INNER |
最適化エンジンがセミ結合クエリを内部結合クエリに変換しないようにします。逆操作は SEMI_TO_INNER です。 |
WIN_MAGIC |
WIN MAGIC クエリ書き換えを有効にし、特定のシナリオで集計や自己結合クエリを結合後に窓関数を使用して最適化します。このヒントを使用すると、最適化エンジンに不要な結合を除去し、窓関数に置き換えるよう指示できます。逆操作は NO_WIN_MAGIC です。 |
NO_WIN_MAGIC |
WIN MAGIC クエリ書き換えを無効にします。逆操作は WIN_MAGIC です。 |
COALESCE_SQ ヒント
COALESCE_SQ ヒントは、クエリ内のサブクエリに対してメジャーコンパクションを実行するよう指示します。その逆操作は NO_COALESCE_SQ ヒントです。
構文
/*+ COALESCE_SQ [ ( [ @ qb_name ] [ qb_name_list ] ) ] */
パラメータの説明
qb_name_list:オプションです。1つまたは複数のQuery Blockの名前リストを指定し、特定のQuery Blockに対してサブクエリのメジャーコンパクションを実行するよう指定できます。このパラメータが省略された場合、ヒントはメジャーコンパクションが可能なすべてのサブクエリに対してメジャーコンパクションを実行するよう指定します。
例
以下のクエリ例では、COALESCE_SQ(("SEL1", "SEL2")) は SEL1, SEL2 の2つのQuery Blockに対してのみメジャーコンパクションを実行するよう指定しています。
UPDATE /*+ COALESCE_SQ(("SEL1", "SEL2")) */ t1
SET c1 = (SELECT /*+ QB_NAME(SEL1) */ c1 FROM t2 A),
c2 = (SELECT /*+ QB_NAME(SEL2) */ c2 FROM t2 B),
c3 = (SELECT /*+ QB_NAME(SEL3) */ c3 FROM t2 C),
c4 = (SELECT /*+ QB_NAME(SEL4) */ c4 FROM t2 D);
NO_COALESCE_SQ ヒント
NO_COALESCE_SQ ヒントは、サブクエリのメジャーコンパクションによるクエリの再構成を禁止します。その逆操作は COALESCE_SQ ヒントです。
構文
/*+ NO_COALESCE_SQ [ ( [ @ qb_name ] ) ] */
パラメータの説明
qb_name:オプションです。特定のQuery Blockに対してサブクエリのメジャーコンパクションを無効にするよう指定できます。このパラメータが省略された場合、ヒントはメジャーコンパクションが可能なすべてのサブクエリに対してメジャーコンパクションを無効にするよう指定します。
例
以下のクエリ例では、NO_COALESCE_SQ ヒントを使用して、いかなるサブクエリのメジャーコンパクションも避け、元のクエリ構造を維持します:
UPDATE /*+ NO_COALESCE_SQ */ t1
SET c1 = (SELECT /*+ QB_NAME(SEL1) */ c1 FROM t2 A),
c2 = (SELECT /*+ QB_NAME(SEL2) */ c2 FROM t2 B),
c3 = (SELECT /*+ QB_NAME(SEL3) */ c3 FROM t2 C),
c4 = (SELECT /*+ QB_NAME(SEL4) */ c4 FROM t2 D);
MERGE ヒント
MERGE ヒントは、ビューのメジャーコンパクションによるクエリの再構成を有効にします。これには、単純ビューのメジャーコンパクションと複雑ビューのメジャーコンパクションが含まれます。その逆操作は NO_MERGE ヒントです。
構文
/*+ MERGE [ ( [ @ qb_name ] [ > upper_qb_name ] ) ] */
パラメータの説明
upper_qb_name:ビューのメジャーコンパクションによる再構成の具体的な形式を指定するために使用します。デフォルト値の使用を推奨します。
例
以下のクエリ例では、MERGE ヒントを使用してサブクエリのビューのメジャーコンパクションによる再構成を有効にします。MERGE ヒントと NO_REWRITE ヒントを組み合わせて使用することで、オプティマイザーにビューのメジャーコンパクションを強制的に実行させると同時に、他のタイプのクエリの再構成を無効にします:
SELECT * FROM (SELECT /*+ MERGE NO_REWRITE */ * FROM t1);
NO_MERGE ヒント
NO_MERGE ヒントは、ビューのメジャーコンパクションによるクエリの再構成を禁止します。その逆操作は MERGE ヒントです。
構文
/*+ NO_MERGE [ ( [ @ qb_name ] ) ] */
例
以下のクエリ例では、NO_MERGE ヒントを使用してサブクエリのビューのメジャーコンパクションによる再構成を無効にします:
SELECT * FROM (SELECT /*+ NO_MERGE */ * FROM t1);
NO_EXPAND ヒント
NO_EXPAND ヒントは、OR 条件を含む WHERE 句に対するクエリ展開のリライトを禁止します。その逆操作は USE_CONCAT ヒントです。
構文
/*+ NO_EXPAND [ ( [ @ qb_name ] ) ] */
例
-- NO_EXPAND ヒントを使用して、OR 条件を含むクエリに対して OR 展開を行わないようオプティマイザーに指示します。
SELECT /*+ NO_EXPAND */ *
FROM employees e, departments d
WHERE e.manager_id = 108
OR d.department_id = 110;
USE_CONCAT ヒント
USE_CONCAT ヒントは、OR 条件を含む WHERE 句に対するクエリ展開のリライトを有効にします。その逆操作は NO_EXPAND ヒントです。
構文
/*+ USE_CONCAT [ ( [ @ qb_name ] [ expand_cond_str ] ) ] */
パラメータの説明
expand_cond_str:オプションです。特定の OR 条件に対してのみクエリ展開のリライトを行うよう指定します。パラメータがデフォルトの場合、ヒントはすべてのOR条件に対するクエリリライトを指定します。
例
- 例1:最初の
OR条件にUSE_CONCATヒントを適用します。
SELECT /*+ USE_CONCAT('b.c1 = c.c1 OR b.c2 = c.c2') */ a.c1, b.c1, c.c1
FROM t1 a
LEFT JOIN (t1 b LEFT JOIN t1 c ON b.c3 = 4 AND (b.c1 = c.c1 OR b.c2 = c.c2))
ON a.c1 = b.c1
WHERE (a.c2 = 3 OR a.c3 = 4)
AND EXISTS (SELECT * FROM t1 d WHERE a.c1 = d.c1 OR a.c2 = d.c2);
- 例2:
USE_CONCATヒントを使用して2番目のOR条件をリライトします。
SELECT /*+ USE_CONCAT('a.c2 = 3 OR a.c3 = 4') */ a.c1, b.c1, c.c1
FROM t1 a
LEFT JOIN (t1 b LEFT JOIN t1 c ON b.c3 = 4 AND (b.c1 = c.c1 OR b.c2 = c.c2))
ON a.c1 = b.c1
WHERE (a.c2 = 3 OR a.c3 = 4)
AND EXISTS (SELECT * FROM t1 d WHERE a.c1 = d.c1 OR a.c2 = d.c2);
- 例3:
USE_CONCATヒントを使用してEXISTS句内のOR条件をリライトします。
SELECT /*+ USE_CONCAT('a.c1 = VIEW1.d.c1 OR a.c2 = VIEW1.d.c2') */ a.c1, b.c1, c.c1
FROM t1 a
LEFT JOIN (t1 b LEFT JOIN t1 c ON b.c3 = 4 AND (b.c1 = c.c1 OR b.c2 = c.c2))
ON a.c1 = b.c1
WHERE (a.c2 = 3 OR a.c3 = 4)
AND EXISTS (SELECT * FROM t1 d WHERE a.c1 = d.c1 OR a.c2 = d.c2);
PLACE_GROUP_BY ヒント
PLACE_GROUP_BY ヒントは、Group By のプッシュダウンクエリ変換を有効にし、場合によってはグループ化および集計が必要なデータ量を削減できます。その逆操作は NO/place_GROUP_BY ヒントです。
構文
/*+ PLACE_GROUP_BY [ ( [ @ qb_name ] [ ( table_list ) ] ) ] */
パラメータの説明
@qb_name:オプションです。ヒントを適用するクエリブロックを指定します。table_list:オプションです。特定の結合テーブルに対してGroup Byのプッシュダウンを実行するよう指定できます。このパラメータが省略された場合、ヒントはすべての結合テーブルに対してGroup Byのプッシュダウンを試みることを指定します。
例
以下のクエリ例では、PLACE_GROUP_BY ヒントはオプティマイザーに対し、実行計画内のより適切な位置で GROUP BY 句を処理するよう指示します。
SELECT /*+ PLACE_GROUP_BY */ SUM(t2.c3)
FROM t1
JOIN t2 ON t1.c2 = t2.c2
GROUP BY t1.c2;
NO_PLACE_GROUP_BY ヒント
NO/place_GROUP_BY ヒントは、Group By のプッシュダウンクエリ変換を無効にします。その逆操作は PLACE_GROUP_BY ヒントです。
構文
/*+ NO_PLACE_GROUP_BY [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。ヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、NO/place_GROUP_BY ヒントにより、GROUP BY 操作が元のクエリ階層で発生し、いかなる変換も行われないことが保証されます。
SELECT /*+ NO_PLACE_GROUP_BY */ SUM(t2.c3)
FROM t1
JOIN t2 ON t1.c2 = t2.c2
GROUP BY t1.c2;
SEMI_TO_INNER ヒント
SEMI_TO_INNER ヒントは、EXISTS または IN を含むセミジョインクエリを内部結合クエリに変換するよう有効にします。その逆操作は NO_SEMI_TO_INNER ヒントです。
構文
/*+ SEMI_TO_INNER [ ( [ @ qb_name ] [ table ] ) ] */
パラメータの説明
@qb_name:オプションです。ヒントを適用するクエリブロックを指定します。table:オプションです。セミジョインの右テーブルを指定し、特定のセミジョインに対してクエリ変換を行うことができます。このパラメータが省略された場合、ヒントはすべてのセミジョインに対してクエリ変換を行うことを指定します。ヒントを使用する際は、このパラメータを指定しないことを推奨します。
例
以下のクエリ例では、SEMI_TO_INNER(t2) ヒントはオプティマイザーに対し、t1 と t2 の間のセミジョインをより効率的な内部結合に変換するよう試みるよう指示します。
SELECT /*+ SEMI_TO_INNER(t2) */ *
FROM t1
WHERE EXISTS (SELECT 1 FROM t2 WHERE t1.c1 = t2.c2);
NO_SEMI_TO_INNER ヒント
NO_SEMI_TO_INNER ヒントは、セミジョインクエリを内部結合クエリに変換することを無効にします。その逆操作は SEMI_TO_INNER ヒントです。
構文
/*+ NO_SEMI_TO_INNER [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。ヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、NO_SEMI_TO_INNER ヒントを使用することで、結果セットを導出する際に、オプティマイザーが EXISTS 句のセミジョインを内部結合に変換しようとしないことが保証されます。
SELECT /*+ NO_SEMI_TO_INNER */ *
FROM t1
WHERE EXISTS (SELECT 1 FROM t2 WHERE t1.c1 = t2.c2);
WIN_MAGIC ヒント
WIN_MAGIC ヒントは、WIN MAGIC クエリのリライトを有効にし、特定のシナリオで集計や自己結合クエリが結合後にウィンドウ関数を使用して最適化されるようにします。このヒントを使用すると、オプティマイザーに不要な結合を除去し、ウィンドウ関数に置き換えるよう指示することで、クエリ実行効率を向上させることができます。その逆操作は NO_WIN_MAGIC ヒントです。
構文
/*+ WIN_MAGIC [ ( [ @ qb_name ] [ table_list ] ) ] */
パラメータの説明
table_list:オプションです。どのテーブルがWIN_MAGICクエリのリライト操作に参加すべきかを指定します。パラメータがデフォルトの場合、ヒントはすべてのテーブルに対してクエリのリライトを試みることを指定します。
例
以下のクエリ例では、WIN_MAGIC(t1 v) は、オプティマイザーに対して、t1 テーブルと派生テーブル v に対してウィンドウ関数を適用して処理を最適化するよう指示します。
SELECT /*+ WIN_MAGIC(t1 v) */ *
FROM t1
JOIN (SELECT AVG(c1), c2 FROM t1 GROUP BY c2) v ON t1.c2 = v.c2
ORDER BY t1.pk;
NO_WIN_MAGIC ヒント
NO_WIN_MAGIC ヒントは、WIN MAGIC クエリのリライトを無効にします。その逆操作は WIN_MAGIC ヒントです。
構文
/*+ NO_WIN_MAGIC [ ( [ @ qb_name ] ) ] */
例
以下のクエリ例では、NO_WIN_MAGIC ヒントを使用してクエリを元のまま維持し、ウィンドウ関数によるリライトを回避します。
SELECT /*+ NO_WIN_MAGIC */ *
FROM t1
JOIN (SELECT AVG(c1), c2 FROM t1 GROUP BY c2) v ON t1.c2 = v.c2
ORDER BY t1.pk;