SQLクエリにおいて、ヒューリスティック(Heuristics)関連のHintは、実行可能な解決策を迅速に見つけることを目的としています。これは必ずしも最適な解決策であるとは限りませんが、特に複雑なクエリにおいては、データベースオプティマイザーがさまざまなルールや変換戦略を適用し、最も効果的な実行計画を見つけようとします。
| ヒントタイプ | 説明 |
|---|---|
AGGR_FIRST_UNNEST |
クエリに集計関数(AVG、SUM、MAXなどの関数)を含む場合、AGGR_FIRST_UNNESTヒントは集計関数を含むサブクエリの集計優先サブクエリによるクエリの書き換えを有効にします。その逆操作は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 を使用して集計サブクエリの集計を有効にし、サブクエリの昇格によるクエリの書き換えを優先します。
-- Hint により、オプティマイザーはクエリの解析時にサブクエリ内の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` ヒントで、with 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の抽出を有効または無効にします。その逆操作は 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 ヒントを使用して集計関数(AVGなど)を含むサブクエリの結合を有効にし、サブクエリの優先的なクエリ書き換えを実行します。
-- `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 を使用して、外部クエリブロックによる述語導出によるクエリの書き換えを禁止します。
-- 句の導出を無効にして外部クエリを書き換えます
select /*+no_pred_deduce*/ c1
from (
-- サブクエリの結合を無効にして、no_merge ヒントの有効な使用を保証します
select /*+no_merge*/ t1.* from t1
)
where c1 = 3;
PROJECT_PRUNE ヒント
PROJECT_PRUNE ヒントは、クエリ実行プロセスを最適化し、特にデータセットが大きく、クエリが複雑な場合に、クエリ処理のデータ量を効果的に削減できます。不要な列をカットすることで、クエリブロック(Query Block)の出力を削減します。このクエリ書き換え技術、すなわちProject Pruningは、特に内部クエリブロックを処理する際に、クエリ効率を向上させるのに役立ちます。その逆操作は NO_Project_PRUNE ヒントです。
構文
/*+ PROJECT_PRUNE [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプション。どの特定のクエリブロックにPROJECT_PRUNEヒントを適用するかを指定し、クエリの最適化に対してより細かい粒度の制御を提供します。
例
以下のクエリ例では、PROJECT_PRUNE を使用してProject Pruning書き換えメカニズムを呼び出します。これにより、C1列以外のインラインビュー内のすべての出力列がオプティマイザーによってカットされます。
select c1 from (select /*+no_merge project_prune*/ t1.* from t1);
NOoproject_prune ヒント
NOoproject_prune ヒントは、Project Pruningによるクエリ書き換え操作を無効にします。Project Pruningは、クエリの最適化プロセスで使用されない出力列を自動的にカットします。特定のパフォーマンスまたは機能要件によりこれらの列を保持する必要がある場合、NOoproject_prune ヒントを使用することが特に重要です。その逆操作は PROJECT_PRUNE ヒントです。
構文
/*+ NO_PROJECT_PRUNE [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプション。Project Pruningを適用しないクエリブロックを指定します。複数のクエリブロックが存在する場合、これによりより正確な制御が可能になります。
例
以下のクエリ例では、NOoproject_prune を使用してProject Pruning書き換え操作を禁止します。このクエリ設定により、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:オプション。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、それぞれ PUSH_LIMIT を使用してLimitプッシュダウン結合書き換えを有効にします。
-- t1は既存のテーブル構造であると仮定します
CREATE TABLE t1(c1 int primary key, c2 int, c3 int);
-- PUSH_LIMIT ヒントを使用したクエリ例
SELECT /*+push_limit*/ *
FROM t1 a LEFT JOIN t1 b on a.c2 = b.c2
fetch next 10 rows only;
NO PUSH LIMIT ヒント
NO PUSH LIMIT ヒントは、オプティマイザーが元のクエリ構造を変更することを防ぎます。特に、LIMITが接続クエリ内部にプッシュダウンされることを望まない場合に有効です。その逆操作は PUSH LIMIT ヒントです。
構文
/*+ NO_PUSH_LIMIT [ ( [ @ qb_name ] ) ] */
パラメータの説明
@qb_name:オプション。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、NO PUSH LIMIT を使用して、接続書き換えへのLimitプッシュダウンを禁止します。
-- t1は既存のテーブル構造であると仮定します
CREATE TABLE t1(c1 int primary key, c2 int, c3 int);
-- NO PUSH LIMIT ヒントを使用したクエリ例
SELECT /*+no_push_limit*/ *
FROM t1 a LEFT JOIN t1 b ON a.c2 = b.c2
FETCH NEXT 10 ROWS ONLY;
REPLACE CONST ヒント
REPLACE CONST ヒントは、オプティマイザーによる定数伝播クエリ書き換えを有効にします。これは、クエリ内の等価条件を定数に置き換えることで、複雑さを低減し、クエリのパフォーマンスを向上させるものです。その逆操作は NO_REPLACE_CONST ヒントです。
構文
/*+ 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);
-- 修正例のヒント使用を `NO_SIMPLIFY_LIMIT` ではなく `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 はQuery Block Name(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:オプション。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、NO_UNNEST を使用してサブクエリの向上に関連するクエリの書き換えを禁止します。
-- テーブルt1が作成されていることを前提とします
CREATE TABLE t1(c1 INT, c2 INT, c3 INT);
-- NO_UNNESTヒントを適用して、サブクエリが自動的に結合操作に書き換えられないようにします
SELECT (SELECT /*+no_unnest*/ COUNT(*)
FROM t1 b
WHERE a.c2 = b.c2)
FROM t1 a;