SQLクエリにおいて、ヒューリスティック(Heuristics)関連のHintは、実行可能な解決策を迅速に見つけることを目的としています。これが必ずしも最適解であるとは限りませんが、特に複雑なクエリでは、データベースオプティマイザーは最も効果的な実行計画を見つけるために、さまざまなルールや変換戦略を適用する試みを行います。
Hintタイプ |
説明 |
|---|---|
AGGR_FIRST_UNNEST |
クエリに集約関数(AVG、SUM、MAXなどの関数)を含むサブクエリが含まれる場合、AGGR_FIRST_UNNEST Hintは集約優先サブクエリを有効にしてクエリのリライトを促進します。その逆操作はNO_AGGR_FIRST_UNNESTです。 |
NO_AGGR_FIRST_UNNEST |
集約優先サブクエリを有効にしたクエリのリライトを禁止します。その逆操作はAGGR_FIRST_UNNESTです。 |
COUNT_TO_EXISTS |
COUNTサブクエリをEXISTSサブクエリに変換してクエリをリライトすることを有効にします。その逆操作はNO_COUNT_TO_EXISTSです。 |
NO_COUNT_TO_EXISTS |
COUNTサブクエリをEXISTSサブクエリに変換してクエリをリライトすることを禁止します。その逆操作はCOUNT_TO_EXISTSです。 |
ELIMINATE_JOIN |
クエリ実行計画内の不要な結合(join)操作を特定して削除します。その逆操作はNO_ELIMINATE_JOINです。 |
NO_ELIMINATE_JOIN |
クエリ実行計画内の結合(join)操作を削除しません。その逆操作はELIMINATE_JOINです。 |
FAST_MINMAX |
クエリのMINまたはMAX最適化を有効にしたクエリのリライトを有効にします。その逆操作はNO_FAST_MINMAXです。 |
NO_FAST_MINMAX |
クエリのMINまたはMAX最適化を無効にしたクエリのリライトを有効にします。その逆操作はFAST_MINMAXです。 |
INLINE |
オプティマイザーに指示して、共通テーブル式(CTE)を展開し、そのクエリ内容を主体クエリに直接埋め込みます。その逆操作はMATERIALIZEです。 |
MATERIALIZE |
CTEの抽出を制御するか、CTEの展開を行いません。その逆操作はINLINEです。 |
JOIN_FIRST_UNNEST |
集約関数のサブクエリを処理する際、結合(join)操作を優先して使用するクエリのリライトを試みます。その逆操作はNO_JOIN_FIRST_UNNESTです。 |
NO_JOIN_FIRST_UNNEST |
集約サブクエリで結合優先のリライト戦略を適用することを禁止します。その逆操作はJOIN_FIRST_UNNESTです。 |
LEFT_TO_ANTI |
オプティマイザーが外部結合(OUTER JOIN)を逆結合(ANTI JOIN)に変換する試みを有効にします。その逆操作はNO_LEFT_TO_ANTIです。 |
NO_LEFT_TO_ANTI |
オプティマイザーが外部結合(OUTER JOIN)を逆結合(ANTI JOIN)に変換する試みを無効にします。その逆操作はLEFT_TO_ANTIです。 |
OUTER_TO_INNER |
オプティマイザーが可能な場合、外部結合(OUTER JOIN)を内部結合(INNER JOIN)にリライトすることを有効にします。その逆操作はNO_OUTER_TO_INNERです。 |
NO_OUTER_TO_INNER |
オプティマイザーが外部結合(OUTER JOIN)を内部結合(INNER JOIN)にリライトすることを無効にします。その逆操作はOUTER_TO_INNERです。 |
PRED_DEDUCE |
オプティマイザーが既存の述語を利用して新しい述語を生成し、推論とプッシュダウンによってクエリの実行を最適化することを有効にします。この種のリライトは、一般的にネストされたクエリや結合クエリに対して有効です。その逆操作はNO_PRED_DEDUCEです。 |
NO_PRED_DEDUCE |
オプティマイザーが既存の述語を利用して新しい述語を生成することを禁止します。その逆操作はPRED_DEDUCEです。 |
PROJECT_PRUNE |
オプティマイザーに指示して、内部クエリブロック内の未使用の投影列を削除します。これは、複数テーブルの結合や多層ネストされたクエリを含む場合に特に有用です。その逆操作はNO_Project_PRUNEです。 |
NO_Project_PRUNE |
オプティマイザーが内部クエリブロック内の未使用の投影列を削除することを禁止します。その逆操作はPROJECT_PRUNEです。 |
PULLUP_expr |
式のプルアップリライトを有効にします。その逆操作はNO_PULLUP_exprです。 |
NO_PULLUP_expr |
式のプルアップリライトを無効にします。その逆操作はPULLUP_exprです。 |
PUSH_LIMIT |
リミットプッシュダウンリライトを有効にします。その逆操作はNO PUSH_LIMITです。 |
NO_PUSH_LIMIT |
リミットプッシュダウンリライトを無効にします。その逆操作はPUSH_LIMITです。 |
REPLACE_CONST |
定数伝播リライトを有効にします。その逆操作はNO_REPLACE_CONSTです。 |
NO_REPLACE_CONST |
定数伝播リライトを無効にします。その逆操作はREPLACE_CONSTです。 |
SIMPLIFY_DISTINCT |
一連のDistinct関連クエリリライトを有効にします。その逆操作はNO_SIMPLIFY_DISTINCTです。 |
NO_SIMPLIFY_DISTINCT |
一連のDistinct関連クエリリライトを禁止します。その逆操作はSIMPLIFY_DISTINCTです。 |
SIMPLIFY_EXPR |
式変換関連クエリリライトを有効にします。その逆操作はNO_SIMPLIFY_EXPRです。 |
NO_SIMPLIFY_EXPR |
式変換関連クエリリライトを禁止します。その逆操作はSIMPLIFY_EXPRです。 |
SIMPLIFY_GROUP_BY |
Group By関連クエリリライトを有効にします。その逆操作はNO_SIMPLIFY_GROUP_BYです。 |
NO_SIMPLIFY_GROUP_BY |
Group By関連クエリリライトを禁止します。その逆操作はSIMPLIFY_GROUP_BYです。 |
SIMPLIFY_LIMIT |
Limit関連クエリリライトを有効にします。その逆操作はNO_SIMPLIFY_LIMITです。 |
NO_SIMPLIFY_LIMIT |
Limit関連クエリリライトを禁止します。その逆操作はSIMPLIFY_LIMITです。 |
SIMPLIFY_ORDER_BY |
Order By関連クエリリライトを有効にします。その逆操作はNO_SIMPLIFY_ORDER_BYです。 |
NO_SIMPLIFY_ORDER_BY |
Order By関連クエリリライトを禁止します。その逆操作はSIMPLIFY_ORDER_BYです。 |
SIMPLIFY_SET |
集合クエリ関連クエリリライトを有効にします。その逆操作はNO_SIMPLIFY_SETです。 |
NO_SIMPLIFY_SET |
集合クエリ関連クエリリライトを禁止します。その逆操作はSIMPLIFY_SETです。 |
SIMPLIFY_SUBQUERY |
サブクエリ関連クエリリライトを有効にします。その逆操作はNO_SIMPLIFY_SUBQUERYです。 |
NO_SIMPLIFY_SUBQUERY |
サブクエリ関連クエリリライトを禁止します。その逆操作はSIMPLIFY_SUBQUERYです。 |
SIMPLIFY_WINFUNC |
ウィンドウ関数関連クエリリライトを有効にします。その逆操作はNO_SIMPLIFY_WINFUNCです。 |
NO_SIMPLIFY_WINFUNC |
ウィンドウ関数関連クエリリライトを禁止します。その逆操作はSIMPLIFY_WINFUNCです。 |
UNNEST |
サブクエリ昇格リライトを有効にします。その逆操作はNO_UNNESTです。 |
NO_UNNEST |
サブクエリ昇格リライトを無効にします。その逆操作はUNNESTです。 |
AGGR_FIRST_UNNEST ヒント
AGGR_FIRST_UNNEST ヒントは、オプティマイザーが集約関数を含むサブクエリを処理する際に、主クエリへの統合ではなく独立した集計計算を優先的に考慮するよう指示します。その逆操作は NO_AGGR_FIRST_UNNEST ヒントです。
ただし、AGGR_FIRST_UNNEST/NO_AGGR_FIRST_UNNEST ヒントを直接使用することは推奨されません。これらはサブクエリの昇格に関するリライト動作に直接影響するためです。通常、サブクエリの昇格動作をより基本的に制御する必要がある場合は、UNNEST または NO_UNNEST ヒントの使用を推奨します。
構文
/*+ AGGR_FIRST_UNNEST [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントに従う特定のクエリブロックを指定します。
例
以下のクエリ例では、AGGR_FIRST_UNNEST を使用して集約型サブクエリの集計を有効にし、サブクエリの昇格によるクエリのリライトを優先します。
-- ヒントにより、オプティマイザーはクエリ解析時にサブクエリ内のAVG集約関数の昇格処理を優先します。
SELECT * FROM t1
WHERE t1.c1 > (SELECT /*+ AGGR_FIRST_UNNEST */ AVG(d1)
FROM t2
WHERE t1.c2 = t2.d2);
NO_AGGR_FIRST_UNNEST ヒント
NO_AGGR_FIRST_UNNEST ヒントは、オプティマイザーが集約関数を含むサブクエリを処理する際に、独立した集計計算を優先することを禁止します。その逆操作は AGGR_FIRST_UNNEST ヒントです。
ただし、AGGR_FIRST_UNNEST/NO_AGGR_FIRST_UNNEST ヒントを直接使用することは推奨されません。これらはサブクエリの昇格に関するリライト動作に直接影響するためです。通常、サブクエリの昇格動作をより基本的に制御する必要がある場合は、UNNEST または NO_UNNEST ヒントの使用を推奨します。
構文
/*+ NO_AGGR_FIRST_UNNEST [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントに従う特定のクエリブロックを指定します。
例
以下のクエリ例では、NO_AGGR_FIRST_UNNEST ヒントを使用しています。このクエリは元の集約サブクエリの形式を維持し、集計優先のクエリリライトは行いません。
SELECT * FROM t1
WHERE t1.c1 > (SELECT /*+ NO_AGGR_FIRST_UNNEST */ AVG(d1)
FROM t2
WHERE t1.c2 = t2.d2);
COUNT_TO_EXISTS ヒント
COUNT_TO_EXISTS ヒントは、COUNT サブクエリを EXISTS サブクエリに変換するクエリリライトを有効にします。その逆操作は NO_COUNT_TO_EXISTS ヒントです。
構文
/*+ COUNT_TO_EXISTS [ ( [ @ qb_name ] [ qb_name_list ] ) ] */
パラメータの説明
qb_name_listは、特定のQuery Blockのサブクエリの書き換えを指定できます。このパラメータが省略されている場合、ヒントはすべてのサブクエリに対する書き換えを試みることを指定します。
例
以下のクエリ例では、COUNT_TO_EXISTS ヒントを使用して、COUNT サブクエリのクエリ書き換えを有効にします。
-- `COUNT_TO_EXISTS` ヒントは、オプティマイザーに内包された `COUNT` サブクエリをより効率的な `EXISTS` 形式に変換するよう指示します。
SELECT /*+ COUNT_TO_EXISTS */ * FROM t1
WHERE (SELECT COUNT(*) FROM t2 WHERE t2.c1 = t1.c2) > 0;
NO_COUNT_TO_EXISTS ヒント
COUNT_TO_EXISTS ヒントは、COUNT サブクエリを EXISTS サブクエリに変換するクエリ書き換えを無効にします。その逆操作は COUNT_TO_EXISTS ヒントです。
構文
/*+ NO_COUNT_TO_EXISTS [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。qb_name_list:特定のQuery Blockのサブクエリの書き換えを無効にすることを指定できます。このパラメータが省略されている場合、ヒントはすべてのサブクエリに対する書き換えの無効化を試みることを指定します。
例
以下のクエリ例では、NO_COUNT_TO_EXISTS ヒントを使用して、COUNT サブクエリのクエリ書き換えを禁止します。
-- `NO_COUNT_TO_EXISTS` ヒントを使用すると、COUNTサブクエリを変換せずに元のまま使用します。
SELECT /*+ NO_COUNT_TO_EXISTS */ * FROM t1
WHERE (SELECT COUNT(*) FROM t2 WHERE t2.c1 = t1.c2) > 0;
ELIMINATE_JOIN ヒント
ELIMINATE_JOIN ヒントは、結合除去のクエリ書き換えを制御します。その逆操作は NO_ELIMINATE_JOIN ヒントです。
構文
/*+ ELIMINATE_JOIN [ ( [ @ qb_name ] [ table_list ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。table_list:オプションです。特定の結合テーブルに対して結合除去を実行するかどうかを指定できます。パラメータがデフォルトの場合、ヒントはすべての結合テーブルで結合除去を試行することを指定します。
例
以下のクエリ例では、それぞれ ELIMINATE_JOIN ヒントを使用して結合除去を有効にし、クエリの書き換えを行います。
-- `ELIMINATE_JOIN` ヒントを使用して自己結合 t1 を検出し、除去する
CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, c3 INT);
SELECT /*+ ELIMINATE_JOIN */ *
FROM t1 a, t1 b
WHERE a.c1 = b.c1;
NO_ELIMINATE_JOIN ヒント
NO_ELIMINATE_JOIN ヒントは結合除去によるクエリの書き換えを無効にし、指定されたすべての結合を保持します。これは ELIMINATE_JOIN ヒントの逆操作です。
構文
/*+ NO_ELIMINATE_JOIN [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。table_list:オプションです。特定の結合テーブルに対して結合除去を無効にするかどうかを指定できます。パラメータがデフォルトの場合、ヒントはすべての結合テーブルで結合除去を無効にすることを試行することを指定します。
例
以下のクエリ例では、NO_ELIMINATE_JOIN を使用して結合除去によるクエリの書き換えを禁止します。
-- `NO_ELIMINATE_JOIN` ヒントを使用して結合操作が保持されることを確認する
SELECT /*+ NO_ELIMINATE_JOIN */ *
FROM t1 a, t1 b
WHERE a.c1 = b.c1;
FAST_MINMAX ヒント
FAST_MINMAX ヒントは、MIN/MAX 集計関数を使用するクエリの書き換えを有効にします。これはデータベースのクエリオプティマイザーに指示して、最小値と最大値をより迅速に取得するためにクエリを書き換えさせます。これの逆操作は NO_FAST_MINMAX ヒントです。
構文
/*+ FAST_MINMAX [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、FAST_MINMAX ヒントを使用して、クエリの MIN/MAX 最適化によるクエリ変換を有効にします。
CREATE TABLE t1(c1 int primary key, c2 int, c3 int);
-- `FAST_MINMAX` ヒントを使用して、MAX(c1) の計算を最速の方法で実行します。
SELECT /*+ FAST_MINMAX */ MAX(c1) FROM t1;
NO_FAST_MINMAX ヒント
NO_FAST_MINMAX ヒントは、MIN/MAX 集約関数に対するクエリのクエリ変換を無効にします。これは FAST_MINMAX ヒントの逆操作です。
構文
/*+ NO_FAST_MINMAX [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、NO_FAST_MINMAX を使用して、クエリの MIN/MAX 最適化によるクエリ変換を禁止します。
CREATE TABLE t1(c1 int primary key, c2 int, c3 int);
-- `FAST_MINMAX` ヒントを使用して、オプティマイザーがMAX(c1) 演算を高速化することを禁止します。
SELECT /*+ NO_FAST_MINMAX */ MAX(c1) FROM t1;
INLINE ヒント
INLINE ヒントは、公共テーブル式(CTE)の展開を指定し、CTEを主クエリに直接統合するために使用されます。これは MATERIALIZE ヒントの逆操作です。
構文
/*+ INLINE [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリに対して、INLINE ヒントを使用して、with cte で定義されたCTEの展開を指定します。
-- `INLINE` ヒントを使用して、メインクエリ内でCTE内に定義されたサブクエリの内容を直接使用する
WITH cte AS (
SELECT /*+INLINE*/ t1.*
FROM t1
JOIN t2 ON t1.c1 = t2.c1
)
SELECT * FROM cte A, cte B;
MATERIALIZE ヒント
MATERIALIZE ヒントは、CTEの抽出を制御し、CTEの展開を行わないようにします。その逆操作は INLINE ヒントです。
構文
/*+ MATERIALIZE [ ( [ @ qb_name ] [ qb_name_list ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。qb_name_list:オプションです。特定のQuery Blockに対するCTEの抽出を無効にします。パラメータがデフォルトの場合、CTEの抽出は行いません。MATERIALIZEヒントは、with cteで定義されたCTE内部での使用を推奨します。
例
以下のクエリでは、MATERIALIZE ヒントを使用して、with cte で定義されたCTEの展開を禁止し、クエリ内の各Query BlockからCTEを抽出することを有効にします。
-- 例1: 単一のCTEをマテリアライズ
WITH cte AS (
SELECT /*+MATERIALIZE*/ * FROM t1
)
SELECT * FROM cte;
-- 例2: 複数のQuery Blocksをマテリアライズ
SELECT /*+MATERIALIZE(("SEL$2", "SEL$3"))*/ v1.*
FROM (SELECT t1.* FROM t1 JOIN t2 ON t1.c1 = t2.c1) v1,
(SELECT t1.* FROM t1 JOIN t2 ON t1.c1 = t2.c1) v2,
(SELECT t1.* FROM t1 JOIN t2 ON t1.c1 = t2.c1) v3,
(SELECT t1.* FROM t1 JOIN t2 ON t1.c1 = t2.c1) v4;
JOIN_FIRST_UNNEST ヒント
JOIN_FIRST_UNNEST ヒントは、集約関数を含むサブクエリの最適化において、まず結合操作を使用することを優先的に検討するようにします。その逆操作は NO_JOIN_FIRST_UNNEST ヒントです。
ただし、JOIN_FIRST_UNNEST/NO_JOIN_FIRST_UNNEST ヒントを直接使用することは推奨されません。サブクエリの昇格による書き換えの介入には、UNNEST/NO_UNNEST ヒントの使用を推奨します。
構文
/*+ JOIN_FIRST_UNNEST [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、JOIN_FIRST_UNNEST ヒントを使用して集約関数を含むサブクエリの結合を有効にし、サブクエリの昇格によるクエリの書き換えを優先的に行います。
-- `JOIN_FIRST_UNNEST` ヒントを使用して、集約関数(例:AVG)を含むサブクエリを処理する場合、実行計画の結合操作(join)を優先します。
SELECT * FROM t1
WHERE t1.c1 > (
SELECT /*+ JOIN_FIRST_UNNEST */ AVG(d1)
FROM t2
WHERE t1.c2 = t2.d2
);
NO_JOIN_FIRST_UNNEST ヒント
NO_JOIN_FIRST_UNNEST ヒントは、集約型サブクエリの結合優先サブクエリによるクエリのリライトを禁止するために使用されます。NO_JOIN_FIRST_UNNEST ヒントを使用すると、クエリオプティマイザーは結合優先戦略を検討しません。その逆操作は JOIN_FIRST_UNNEST ヒントです。
ただし、JOIN_FIRST_UNNEST/NO_JOIN_FIRST_UNNEST ヒントを直接使用することは推奨されません。サブクエリの昇格によるリライトの介入には、UNNEST/NO_UNNEST ヒントの使用を推奨します。
構文
/*+ NO_JOIN_FIRST_UNNEST [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、NO_JOIN_FIRST_UNNEST を使用して、集約型サブクエリの結合優先サブクエリによるクエリのリライトを禁止します。
-- `NO_JOIN_FIRST_UNNEST` ヒントを使用すると、サブクエリと外部クエリの結合操作を検討しません。
SELECT * FROM t1
WHERE t1.c1 > (
SELECT /*+ NO_JOIN_FIRST_UNNEST */ AVG(d1)
FROM t2
WHERE t1.c2 = t2.d2
);
LEFT_TO_ANTI ヒント
LEFT_TO_ANTI ヒントは、OUTER JOIN を ANTI JOIN に変換するクエリのリライトを有効にします。その逆操作は NO_LEFT_TO_ANTI ヒントです。
構文
/*+ LEFT_TO_ANTI [ ( [ @ qb_name ] [ table_list ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。table_list:オプションです。特定のLEFT JOINの右テーブルに対するクエリのリライトを指定できます。パラメータがデフォルトの場合、ヒントはすべてのOUTER JOINに対するリライトを試みることを指定します。
例
以下のクエリ例では、LEFT_TO_ANTI ヒントを使用して、OUTER JOIN を ANTI JOIN に変換するクエリの書き換えを有効にします。
CREATE TABLE t1(c1 int primary key, c2 int, c3 int);
CREATE TABLE t2(c1 int primary key, c2 int, c3 int);
SELECT /*+ LEFT_TO_ANTI(t2) */ * FROM t1 LEFT JOIN t2 ON t1.c2 = t2.c2 WHERE t2.c1 IS NULL;
NO_LEFT_TO_ANTI ヒント
NO_LEFT_TO_ANTI ヒントは、OUTER JOIN を ANTI JOIN に変換するクエリの書き換えを無効にします。その逆操作は LEFT_TO_ANTI ヒントです。
構文
/*+ NO_LEFT_TO_ANTI [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、NO_LEFT_TO_ANTI ヒントを使用して、OUTER JOIN を ANTI JOIN に変換するクエリの書き換えを禁止します。
CREATE TABLE t1(c1 int primary key, c2 int, c3 int);
CREATE TABLE t2(c1 int primary key, c2 int, c3 int);
SELECT /*+ NO_LEFT_TO_ANTI */ * FROM t1
LEFT JOIN t2 ON t1.c2 = t2.c2
WHERE t2.c1 IS NULL;
OUTER_TO_INNER ヒント
OUTER_TO_INNER ヒントは、外部結合を内部結合に変換するクエリの書き換えを制御し、LEFT OUTER JOIN または RIGHT OUTER JOIN をより効率的な INNER JOIN に変換します。その逆操作は NO_OUTER_TO_INNER ヒントです。
構文
/*+ OUTER_TO_INNER [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、OUTER_TO_INNER ヒントを使用して、外部結合を内部結合に変換するクエリの書き換えを有効にします。
-- フィルタ条件 b.c1 > 0 は b テーブルにのみ適用されます。これにより、外部結合における右テーブルのNULL値の可能性が暗黙的に除外され、この外部結合操作を内部結合と見なすことができます。
SELECT /*+ OUTER_TO_INNER */ *
FROM t1 a
LEFT JOIN t1 b ON a.c2 = b.c2
WHERE b.c1 > 0;
NO_OUTER_TO_INNER ヒント
NO_OUTER_TO_INNER ヒントは、外部結合から内部結合へのクエリのリライトを無効にし、クエリオプティマイザーが外部結合を内部結合に変換しないようにします。その逆操作は OUTER_TO_INNER ヒントです。
構文
/*+ NO_OUTER_TO_INNER [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、NO_OUTER_TO_INNER を使用して外部結合から内部結合へのクエリのリライトを禁止します。
-- `WHERE` 句の条件には内部的な結合が暗黙的に含まれている可能性があります。`NO_OUTER_TO_INNER` ヒントは外部結合のロジックが保持されることを保証します。
SELECT /*+ NO_OUTER_TO_INNER */ *
FROM t1 a
LEFT JOIN t1 b ON a.c2 = b.c2
WHERE b.c1 > 0;
PRED_DEDUCE ヒント
PRED_DEDUCE ヒントは、述語推論によるクエリのリライトを制御し、既存の述語から新しい述語を導出したり、述語をプッシュダウンしたりする操作を行います。このようなリライトは、通常、ネストされたクエリや結合クエリに対して有効です。その逆操作は NO_PRED_DEDUCE ヒントです。
構文
/*+ PRED_DEDUCE [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、PRED_DEDUCE を使用して、外部Query Blockが述語推論によるクエリのリライトに参加することを許可します。
-- 述語推論を有効にして外部クエリをリライトする
select /*+pred_deduce*/ c1
from (
-- サブクエリのマージを無効にして、no_merge ヒントの使用が有効であることを保証する
select /*+no_merge*/ t1.* from t1
)
where c1 = 3;
NO_PRED_DEDUCE ヒント
NO_PRED_DEDUCE ヒントは、ヒントオプティマイザーが既存の述語を使用して新しい述語を生成することを無効にします。その逆操作は PRED_DEDUCE ヒントです。
構文
/*+ NO_PRED_DEDUCE [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、NO_PRED_DEDUCE を使用して、外部Query Blockが述語推論によるクエリの書き換えに参加することを禁止します。
-- 述語推論を無効にして、外部クエリの書き換えを行います。
select /*+no_pred_deduce*/ c1
from (
-- サブクエリのマージを無効にして、no_merge ヒントの有効性を保証します。
select /*+no_merge*/ t1.* from t1
)
where c1 = 3;
PROJECT_PRUNE ヒント
PROJECT_PRUNE ヒントはクエリ実行プロセスを最適化し、特にデータセットが大きくクエリが複雑な場合に、クエリ処理のデータ量を効果的に削減できます。不要な列を切り捨てることで、クエリブロックの出力を削減します。このようなクエリの書き換え技術、すなわちプロジェクトプルプリン(Project Pruning)は、特に内部クエリブロックを処理する際のクエリ効率を向上させるのに役立ちます。その逆操作は NO_Project_PRUNE ヒントです。
構文
/*+ PROJECT_PRUNE [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。PROJECT_PRUNEヒントを適用すべき特定のクエリブロックを指定し、クエリ最適化により細かい制御を提供します。
例
以下のクエリ例では、PROJECT_PRUNE を使用してプロジェクトプルプリンの書き換えメカニズムを呼び出しています。これにより、C1 列以外のインラインビュー内のすべての出力列がオプティマイザーによって切り捨てられます。
select c1 from (select /*+no_merge project_prune*/ t1.* from t1);
NOoproject_PRUNE ヒント
NOoproject_PRUNE ヒントは、プロジェクトプルプリンのクエリ書き換え操作を無効にします。プロジェクトプルプリンは、クエリ最適化プロセスで未使用の出力列を自動的に切り捨てます。特定のパフォーマンスまたは機能要件によりこれらの列を保持する必要がある場合、NOoproject_PRUNE ヒントを使用することが特に重要です。その逆操作は PROJECT_PRUNE ヒントです。
構文
/*+ NO_PROJECT_PRUNE [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。プロジェクトプルプリンの適用を回避すべきクエリブロックを指定します。複数のクエリブロックが存在する場合、より正確な制御を提供します。
例
以下のクエリ例では、NOoproject_PRUNE を使用してプロジェクトプルプリンの書き換え操作を禁止しています。この設定により、たとえ c1 以外のすべての出力列が不要であっても、これらの列はインラインビューの結果に残ります。
select c1 from (select /*+no_merge no_project_prune*/ t1.* from t1);
PULLUP_EXPR ヒント
PULLUP_expr ヒントは、オプティマイザーがサブクエリ式を親クエリレベルに引き上げる(プルアップ)ことを許可します。その逆操作は NO_PULLUP_EXPR ヒントです。
構文
/*+ PULLUP_EXPR [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、PULLUP_EXPR ヒントを使用して、式のプルアップ変換を有効にします。式のプルアップクエリ変換がトリガーされると、インラインビュー内の SELECT の中置きクエリが外側にプルアップされます。
-- t1は既存のテーブル構造であることを仮定します。
CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, c3 INT);
-- PULLUP_EXPRヒントを含むクエリを実行します。
SELECT *
FROM (SELECT /*+no_merge pullup_expr*/ t1.*,
(SELECT c2 FROM t1 WHERE c1 = 1)
FROM t1)
WHERE c1 > 1000;
NO.PullUP_EXPR ヒント
NO.pullUP_EXPR ヒントは、クエリオプティマイザーによる式のプルアップ最適化の実行を無効にします。これは PULLUP_EXPR ヒントの逆操作です。
構文
/*+ NO_PULLUP_EXPR [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、NO_PULLUP_EXPR を使用して式のプルアップ変換を禁止します。式のプルアップクエリ変換がトリガーされた場合、インラインビュー内の select 中置きクエリのプルアップを外側に阻止します。
-- t1は既存のテーブル構造であることを仮定します。
CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, c3 INT);
-- NO_PULLUP_EXPRヒントを含むクエリを実行します。
SELECT *
FROM (SELECT /*+no_merge no_pullup_expr*/ t1.*,
(SELECT c2 FROM t1 WHERE c1 = 1)
FROM t1)
WHERE c1 > 1000;
PUSH_LIMIT ヒント
PUSH_LIMIT ヒントは、ページネーションデータを処理する際に使用され、オプティマイザーがLIMIT句(返される行数を制限する)を接続クエリの内部、例えば外部結合やデカルト積に「プッシュダウン」することを許可します。これにより、ページネーションクエリの効率を大幅に向上させることができます。これは NO_PUSH_LIMIT ヒントの逆操作です。
構文
/*+ PUSH_LIMIT [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このHintを適用するクエリブロックを指定します。
例
以下のクエリ例では、それぞれ PUSH_LIMIT を使用して、接続へのLIMITプッシュダウンのリライトを有効にします。
-- t1は既存のテーブル構造であると仮定します
CREATE TABLE t1(c1 int primary key, c2 int, c3 int);
-- PUSH_LIMIT hintを使用したクエリ例
SELECT /*+push_limit*/ *
FROM t1 a LEFT JOIN t1 b on a.c2 = b.c2
fetch next 10 rows only;
NO_PUSH_LIMIT Hint
NO-push_LIMIT Hintは、オプティマイザーが元のクエリ構造を変更するのを防ぎます。特に、LIMITを接続クエリ内部にプッシュダウンさせたくない場合に有効です。その逆操作は PUSH_LIMIT Hintです。
構文
/*+ NO_PUSH_LIMIT [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このHintを適用するクエリブロックを指定します。
例
以下のクエリ例では、NO_PUSH_LIMIT を使用して、接続へのLIMITプッシュダウンのリライトを禁止します。
-- t1は既存のテーブル構造であると仮定します
CREATE TABLE t1(c1 int primary key, c2 int, c3 int);
-- NO_PUSH_LIMIT hintを使用したクエリ例
SELECT /*+no_push_limit*/ *
FROM t1 a LEFT JOIN t1 b ON a.c2 = b.c2
FETCH NEXT 10 ROWS ONLY;
REPLACE_CONST Hint
REPLACE_CONST Hintは、オプティマイザーが定数伝播によるクエリのリライトを有効にします。これにより、クエリ内の等価条件を定数に置き換えて複雑さを低減し、クエリのパフォーマンスを向上させます。その逆操作は NO_REPLACE_CONST Hintです。
構文
/*+ REPLACE_CONST [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、REPLACE_CONST ヒントを使用して、定数伝播によるクエリのリライトを有効にします。
-- t1 が既存のテーブルであることを前提とします。
CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, c3 INT);
-- REPLACE_CONST ヒントを使用したクエリでは、WHERE 句が簡略化されます。
SELECT /*+replace_const*/ c2
FROM t1
WHERE c1 = c2 AND c2 = 4;
NO_REPLACE_CONST ヒント
NO_REPLACE_CONST ヒントは、特定のシナリオで不要なリライトを引き起こす可能性があるため、定数伝播によるクエリのリライトを禁止します。その逆操作は REPLACE_CONST ヒントです。
構文
/*+ NO_REPLACE_CONST [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、NO_REPLACE_CONST ヒントを使用して、定数伝播によるクエリのリライトを禁止します。
-- t1 が既存のテーブルであることを前提とします。
CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, c3 INT);
-- NO_REPLACE_CONST ヒントを使用したクエリ例では、元のクエリ条件を維持します。
SELECT /*+no_replace_const*/ c2
FROM t1
WHERE c1 = c2 AND c2 = 4;
SIMPLIFY_DISTINCT ヒント
SIMPLIFY_DISTINCT ヒントは、オプティマイザーが Distinct クエリのリライトを実行し、Distinct 操作を処理するクエリを簡略化および最適化することを有効にします。その逆操作は NO_SIMPLIFY_DISTINCT ヒントです。
構文
/*+ SIMPLIFY_DISTINCT [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、SIMPLIFY_DISTINCT を使用して一連の Distinct 関連クエリのリライトを有効にします。
CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, c3 INT);
SELECT DISTINCT c1, c2
FROM (SELECT /*+simplify_distinct*/ DISTINCT t1.* FROM t1);
NO_SIMPLIFY_DISTINCT ヒント
NO_SIMPLIFY_DISTINCT ヒントは、Distinct クエリの簡略化処理を明示的に禁止します。これにより、特定のシナリオでクエリの元の形を維持し、オプティマイザーが望ましくない可能性のあるリライトを自動的に行うのを防ぐことができます。その逆操作は SIMPLIFY_DISTINCT ヒントです。
構文
/*+ NO_SIMPLIFY_DISTINCT [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、NO_SIMPLIFY_DISTINCT を使用して一連の Distinct 関連クエリのリライトを禁止します。
CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, c3 INT);
SELECT DISTINCT c1, c2
FROM (SELECT /*+no_simplify_distinct*/ DISTINCT t1.* FROM t1);
SIMPLIFY_EXPR ヒント
SIMPLIFY_EXPR ヒントは、オプティマイザーがクエリ内の式を変換および簡略化するように有効にします。その逆操作は NO_SIMPLIFY_EXPR ヒントです。
構文
/*+ SIMPLIFY_EXPR [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、SIMPLIFY_EXPR ヒントを使用して、オプティマイザーによるクエリ内の式の変換と簡略化を有効にします。
-- `SIMPLIFY_EXPR` ヒントを使用し、条件の簡略化時に冗長なロジックを削除することでクエリの効率を最適化します。
SELECT /*+simplify_expr*/ 1 FROM t1 WHERE c1 = 1 OR 1 = 1;
NO_SIMPLIFY_EXPR ヒント
NO_SIMPLIFY_EXPR ヒントは、オプティマイザーがクエリ内の式を変換および簡略化することを無効にします。その逆操作は SIMPLIFY_EXPR ヒントです。
構文
/*+ NO_SIMPLIFY_EXPR [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、NO_SIMPLIFY_EXPR ヒントを使用して、オプティマイザーによるクエリ内の式の変換と簡略化を無効にします。
-- `NO_SIMPLIFY_EXPR` ヒントを使用し、式の変換と簡略化操作を禁止します。
SELECT /*+no_simplify_expr*/ 1 FROM t1 WHERE c1 = 1 OR 1 = 1;
SIMPLIFY_GROUP_BY ヒント
SIMPLIFY_GROUP_BY ヒントは、GROUP BY 句を含むクエリを最適化するために使用されます。このヒントは、クエリオプティマイザーが GROUP BY 操作を簡略化および書き換えるように有効にします。その逆操作は NO_SIMPLIFY_GROUP_BY ヒントです。
構文
/*+ SIMPLIFY_GROUP_BY [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、SIMPLIFY_GROUP_BY ヒントを使用して、Group By 関連のクエリのリライトを有効にします。
CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, c3 INT);
-- `SIMPLIFY_GROUP_BY` ヒントは、オプティマイザーがリライトにより集約操作の実行を最適化することを許可します。
SELECT /*+simplify_group_by*/ COUNT(DISTINCT c1) FROM t1 GROUP BY c2;
NO_SIMPLIFY_GROUP_BY ヒント
NO_SIMPLIFY_GROUP_BY ヒントは、クエリの元のロジックを変更しないように、任意の GROUP BY 関連のクエリのリライトを禁止します。その逆操作は SIMPLIFY_GROUP_BY ヒントです。
構文
/*+ NO_SIMPLIFY_GROUP_BY [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、NO_SIMPLIFY_GROUP_BY を使用して、元の GROUP BY ロジックを維持し、自動化されたクエリの最適化を防ぎます。
CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, c3 INT);
SELECT /*+no_simplify_group_by*/ COUNT(DISTINCT c1) FROM t1 GROUP BY c2;
SIMPLIFY_LIMIT ヒント
SIMPLIFY_LIMIT ヒントは、オプティマイザーが LIMIT 句に対するクエリ出力を簡略化し、ページネーションクエリのパフォーマンスを向上させることを許可します。その逆操作は NO_SIMPLIFY_LIMIT ヒントです。
構文
/*+ SIMPLIFY_LIMIT [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、SIMPLIFY_LIMIT ヒントを使用して、Limit 関連のクエリのリライトを有効にします。
CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, c3 INT);
-- `SIMPLIFY_LIMIT` を使用し、`NO_SIMPLIFY_LIMIT` は使用しないでください。修正後のヒントの使用例を参照してください。
SELECT /*+simplify_limit*/ *
FROM (SELECT /*+no_rewrite*/ ROWNUM cnt,
(SELECT c2 FROM t1 WHERE c1 = 1)
FROM t1)
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
NO_SIMPLIFY_LIMIT ヒント
NO_SIMPLIFY_LIMIT ヒントは、LIMIT 句に対するクエリのリライトを回避するために使用されます。その逆操作は SIMPLIFY_LIMIT ヒントです。
構文
/*+ NO_SIMPLIFY_LIMIT [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、NO_SIMPLIFY_LIMIT を使用して LIMIT 関連のクエリリライトを禁止します。
CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, c3 INT);
-- `NO_SIMPLIFY_LIMIT` を使用して、元のページネーションロジックが変更されないようにします
SELECT /*+no_simplify_limit*/ *
FROM (SELECT /*+no_rewrite*/ ROWNUM cnt,
(SELECT c2 FROM t1 WHERE c1 = 1)
FROM t1)
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
SIMPLIFY_ORDER_BY ヒント
SIMPLIFY_ORDER_BY ヒントは、ORDER BY 句を含むクエリを最適化するために使用されます。このヒントは、クエリオプティマイザーが ORDER BY 操作を簡略化およびリライトすることを有効にします。その逆操作は NO_SIMPLIFY_ORDER_BY ヒントです。
構文
/*+ SIMPLIFY_ORDER_BY [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、SIMPLIFY_GROUP_BY を使用して Group By 関連のクエリリライトを有効にします。
CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, c3 INT);
-- `SIMPLIFY_ORDER_BY` ヒントは、オプティマイザーがリライトによりソート操作の実行を最適化するようにします。
SELECT /*+simplify_order_by*/ c1 FROM
(SELECT /*+no_merge*/ * FROM t1 ORDER BY c2) ORDER BY c2 DESC;
NO_SIMPLIFY_ORDER_BY ヒント
NO_SIMPLIFY_ORDER_BY ヒントは、クエリの元のロジックを変更しないように、ORDER BY 関連のクエリリライトを禁止します。その逆操作は SIMPLIFY_ORDER_BY ヒントです。
構文
/*+ NO_SIMPLIFY_ORDER_BY [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、NO_SIMPLIFY_ORDER_BY を使用して元の ORDER BY ロジックを維持し、自動化されたクエリ最適化を防ぎます。
CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, c3 INT);
SELECT /*+no_simplify_order_by*/ c1 FROM
(SELECT /*+no_merge*/ * FROM t1 ORDER BY c2) ORDER BY c2 DESC;
SIMPLIFY_SUBQUERY ヒント
SIMPLIFY_SUBQUERY ヒントは、ネストされたサブクエリのリライトを有効にし、不要なサブクエリ構造を変換または除去してクエリロジックを簡略化するのに役立ちます。その逆操作は NO_SIMPLIFY_SUBQUERY ヒントです。
構文
/*+ SIMPLIFY_SUBQUERY [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、SIMPLIFY_SUBQUERY を使用してサブクエリ関連のクエリリライトを有効にします。
-- t1は事前に作成済みのテーブルと仮定します
CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, c3 INT);
-- クエリ例は `SIMPLIFY_SUBQUERY` ヒントの使用方法を示しており、オプティマイザーが不要なサブクエリ部分を簡略化または除去することを有効にします。
SELECT /*+simplify_subquery*/ * FROM t1
WHERE EXISTS (SELECT * FROM t1);
NO_SIMPLIFY_SUBQUERY ヒント
NO_SIMPLIFY_SUBQUERY ヒントは、サブクエリの自動リライトを阻止し、元のクエリ構造とロジックを維持します。その逆操作は SIMPLIFY_SUBQUERY ヒントです。
構文
/*+ NO_SIMPLIFY_SUBQUERY [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、NO_SIMPLIFY_SUBQUERY を使用して、サブクエリに関連するクエリのリライトを禁止します。
-- t1 は事前に作成済みのテーブルであることを仮定します
CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, c3 INT);
-- クエリ例は `NO_SIMPLIFY_SUBQUERY` ヒントの使用方法を示しており、オプティマイザーによるサブクエリのリライトを防ぎます。
SELECT /*+no_simplify_subquery*/ * FROM t1
WHERE EXISTS (SELECT * FROM t1);
SIMPLIFY_SET ヒント
SIMPLIFY_SET ヒントは、オプティマイザーが集合演算(UNION、INTERSECT、EXCEPT など)のリライトを有効にするために使用されます。その逆操作は NO_SIMPLIFY_SET ヒントです。
構文
/*+ SIMPLIFY_SET [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
説明
<集合クエリのQuery Blockには、ヒントを直接追加する場所がないため、QB Nameを使用してヒントの対象となるQuery Blockを指定する必要があります。
例
以下のクエリ例では、SIMPLIFY_SET を使用して集合クエリ関連のクエリリライトを有効にします。
-- t1は既存のテーブルであると仮定します
CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, c3 INT);
-- SIMPLIFY_SET ヒントを使用してクエリを最適化
SELECT /*+simplify_set(@set$1)*/ * FROM t1
UNION ALL
SELECT * FROM t1 WHERE 1 = 0;
上記の例にはヒント(/*+simplify_set(@set$1)*/)が含まれており、データベースオプティマイザーによるこの特定の集合演算(UNION ALL)クエリの自動簡略化を無効にします。@set$1 はQuery Block Name(QB Name)であり、この場合、UNION ALL クエリステートメント全体を識別するために使用されます。
NO_SIMPLIFY_SET ヒント
NO_SIMPLIFY_SET ヒントは、集合クエリ関連のクエリリライトを無効にします。その逆操作は SIMPLIFY_SET ヒントです。
構文
/*+ NO_SIMPLIFY_SET [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
説明
<集合クエリのQuery Blockには、ヒントを直接追加する場所がないため、QB Nameを使用してヒントの対象となるQuery Blockを指定する必要があります。
例
以下のクエリ例では、NO_SIMPLIFY_SET ヒントを使用して、集合クエリに関連するクエリのリライトを禁止します。
-- 事前定義されたテーブル t1 に対して
CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, c3 INT);
-- NO_SIMPLIFY_SET ヒントを使用して、集合クエリのリライトを防ぐ
SELECT /*+no_simplify_set(@set$1)*/ * FROM t1
UNION ALL
SELECT * FROM t1 WHERE 1 = 0;
上記の例にはヒント(/*+no_simplify_set(@set$1)*/)が含まれており、このヒントはデータベースオプティマイザーによるこの特定の集合演算(UNION ALL)クエリの自動簡略化を無効にします。@set$1 はクエリブロック名(QB Name)であり、この場合、UNION ALL クエリステートメント全体を識別するために使用されます。
SIMPLIFY_WINFUNC ヒント
SIMPLIFY_WINFUNC ヒントは、ウィンドウ関数(Window Functions)を含むクエリに対する効果的なリライトをオプティマイザーに許可します。その逆操作は NO_SIMPLIFY_WINFUNC ヒントです。
構文
/*+ SIMPLIFY_WINFUNC [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、SIMPLIFY_WINFUNC ヒントを使用して、ウィンドウ関数に関連するクエリのリライトを有効にします。
-- t1 テーブルが作成されていることを前提とします
CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, c3 INT);
-- SIMPLIFY_WINFUNC ヒントを使用したクエリ例。オプティマイザーが MAX(c2) OVER (PARTITION BY c1) の計算プロセスを簡略化するための可能なリライトを認識し、実装することを有効にします。
SELECT /*+simplify_winfunc*/ MAX(c2) OVER (PARTITION BY c1) FROM t1;
NO_SIMPLIFY_WINFUNC ヒント
NO_SIMPLIFY_WINFUNC ヒントは、ウィンドウ関数を含むクエリのリライトをオプティマイザーに禁止します。特殊なロジックが絶対に元のまま保たれる必要がある場合に使用します。その逆操作は SIMPLIFY_WINFUNC ヒントです。
構文
/*+ NO_SIMPLIFY_WINFUNC [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、NO_SIMPLIFY_WINFUNC を使用して、ウィンドウ関数に関連するクエリのリライトを禁止します。
-- t1 テーブルが既に存在することを前提とします
CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, c3 INT);
-- NO_SIMPLIFY_WINFUNC ヒントを適用したクエリは、ウィンドウ関数の元の動作を維持します
SELECT /*+no_simplify_winfunc*/ MAX(c2) OVER (PARTITION BY c1) FROM t1;
UNNEST ヒント
UNNEST ヒントは、オプティマイザーがサブクエリをジョイン(joins)に分割してクエリのリライトを向上させるように有効化し、クエリ内で現れるサブクエリをさまざまなジョインに変換します。その逆操作は NO_UNNEST ヒントです。
OceanBaseデータベースは、AGGR_FIRST_UNNEST ヒントや JOIN_FIRST_UNNEST ヒントなど、さらなるサブクエリの向上最適化をサポートしています。これらはそれぞれ、オプティマイザーに対してサブクエリの向上時に集計または結合操作を優先的に考慮するよう指示します。それでも、ほとんどのシナリオでは、UNNEST ヒントの直接使用を推奨します。なぜなら、それは汎用的な最適化戦略を提供するからです。
構文
/*+ UNNEST [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、UNNEST ヒントを使用してサブクエリの向上に関連するクエリのリライトを有効化します。
-- テーブル t1 が作成されていることを仮定します
CREATE TABLE t1(c1 INT, c2 INT, c3 INT);
-- UNNEST ヒントを使用したクエリは、サブクエリの向上をトリガーします
SELECT (SELECT /*+unnest*/ COUNT(*)
FROM t1 b
WHERE a.c2 = b.c2)
FROM t1 a;
NO_UNNEST ヒント
NO_UNNEST ヒントは、サブクエリが効果的にジョインにリライト可能な場合でも、サブクエリの向上によるクエリのリライトを阻止します。その逆操作は UNNEST ヒントです。
構文
/*+ NO_UNNEST [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプションです。このHintを適用するクエリブロックを指定します。
例
以下のクエリ例では、NO_UNNEST を使用して、サブクエリの昇格による関連クエリのリライトを禁止します。
-- テーブルt1が既に作成されていることを前提とします。
CREATE TABLE t1(c1 INT, c2 INT, c3 INT);
-- NO_UNNEST Hintを適用して、サブクエリが自動的に結合操作にリライトされないようにします。
SELECT (SELECT /*+no_unnest*/ COUNT(*)
FROM t1 b
WHERE a.c2 = b.c2)
FROM t1 a;