説明
このステートメントは、アウトラインを作成するために使用します。アウトラインの作成方法は2通りあります。1つは SQL_TEXT(ユーザーが実行したパラメータ付きの元のステートメント)を使用する方法で、もう1つは SQL_ID を使用して作成する方法です。
注意
アウトラインを作成するには、対応するユーザーの下で実行する必要があります。
構文
sql_text_stmt:
CREATE [OR REPLACE] OUTLINE outline_name ON stmt [TO target_stmt];
sql_id_stmt:
CREATE [OR REPLACE] OUTLINE outline_name ON 'sql_id' USING HINT hint;
パラメータの説明
パラメータ |
説明 |
|---|---|
| sql_text_stmt | SQL_TEXT を使用してアウトラインを作成するステートメントを表します。 |
| sql_id_stmt | SQL_ID を使用してアウトラインを作成するステートメントを表します。 |
| outline_name | 作成するアウトライン名を指定します。 |
| OR REPLACE | オプションです。OR REPLACE を指定すると、作成しようとするアウトラインが既に存在する場合、既存のアウトラインを置き換えます。 |
| stmt | 通常はヒントと元のパラメータを持つDMLステートメントです。 |
| TO target_stmt | オプションです。TO target_stmt を指定しない場合、データベースが受け入れるSQLがパラメータ化された後、stmt の hint パラメータ化テキストと同じである場合、そのSQLを stmt の hint にバインドして実行計画を生成します。hint を含むステートメントに対して固定計画を適用したい場合は、元のSQLを指定するために TO target_stmt が必要です。
注意
|
| sql_id | sql_id が対応するSQLステートメントに既にヒントがある場合、アウトラインで指定されたヒントが元のステートメント内のすべてのヒントを上書きします。 |
| hint | アウトラインのヒントを指定します。形式は /*+ xxx */ です。ヒント構文の詳細については、Optimizer Hintを参照してください。 |
例
テストテーブル
employeesを作成します。obclient> CREATE TABLE employees ( emp_id INT, dept_id INT, salary INT, emp_name VARCHAR(50));テーブル
employeesにデータを挿入します。obclient> INSERT INTO employees VALUES (1001, 10, 10000, 'John'), (1002, 10, 12000, 'Mike'), (1003, 20, 15000, 'Sarah');テーブル
employeesのdept_id列にインデックスidx_dept_idを作成します。obclient> CREATE INDEX idx_dept_id ON employees(dept_id);SQL_TEXTを使用してoutline1を作成します。obclient> CREATE OUTLINE outline1 ON SELECT/*+ index(employees idx_dept_id)*/ * FROM employees WHERE dept_id = 10;SQL_IDを使用してoutline2を作成します。まず、アウトラインをバインドするSQLの
SQL_IDを確認します。obclient> SELECT sql_id, trace_id, client_ip, user_name, query_sql FROM sys.V$OB_SQL_AUDIT WHERE query_sql LIKE '%employees%';調べた
SQL_IDを使用してアウトラインを作成します。obclient> CREATE OUTLINE outline2 ON '549D27D6DD54688A9B25FD82D5650B96' USING HINT /*+ index(employees idx_dept_id)*/;
注意事項
SQL_ID が同じ場合、SQL_TEXT 方式で作成されたアウトラインは SQL_ID 方式で作成されたアウトラインを上書きします。SQL_TEXT 方式で作成されたものの方が優先順位が高いです。
また、OceanBaseデータベースは SQL_ID によって異なるSQLを区別しますが、SQL_ID は SQL_TEXT から MD5 アルゴリズムでハッシュ値を取ったものです。同じSQLテキストでも、改行やタブ文字が1つ増えただけで、MD5 で得られる SQL_ID は異なります。実際の本番システムでは、SQL_ID を用いたアウトラインのバインドを推奨します。