SQLクエリにおいて、コスト推定に関連するヒントは、オプティマイザーが特定の状況下で特定のクエリ変換を採用または回避するよう指示します。例えば、クエリ構造の書き換え、ビューのメジャーコンパクションまたはマイナーコンパクションなどです。
ヒントタイプ |
説明 |
|---|---|
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:
USE_CONCATヒントを最初のOR条件に適用する
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;