SQLクエリにおいて、ヒューリスティックス(Heuristics)関連のヒントは、必ずしも最適解であるとは限らないものの、実行可能な解を迅速に見つけることを目的としています。特に複雑なクエリでは、データベースオプティマイザーは最も効果的な実行計画を見つけるために、さまざまなルールや変換戦略を適用する試みを行います。
ヒントタイプ |
説明 |
|---|---|
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 を使用して集約型サブクエリの集計を有効にし、サブクエリの昇格によるクエリのリライトを優先します。
-- このヒントにより、オプティマイザーはクエリの解析時にサブクエリ内の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の抽出を制御し、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 を使用して、外部クエリブロックが述語推論によるクエリのリライトに参加することを有効にします。
-- 述語推論を有効にして外部クエリをリライトする
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 ヒントはクエリ実行プロセスを最適化し、特にデータセットが大きくクエリが複雑な場合に、クエリ処理のデータ量を効果的に削減できます。不要な列を切り捨てることで、クエリブロックの出力を削減します。このようなクエリの再構成技術、すなわちプロジェクトプルーニングは、特に内部クエリブロックを処理する際のクエリ効率を向上させるのに役立ちます。その逆操作は 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:オプションです。このヒントを適用するクエリブロックを指定します。
例
以下のクエリ例では、それぞれ 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;