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;