Oracle Database
ヒント
サーチ…
パラメーター
パラメーター | 詳細 |
---|---|
並列度(DOP) | これは、クエリを開くための並列接続/プロセスの数です。それは通常2,4,8,16などです。 |
テーブル名 | 並列ヒントが適用されるテーブルの名前。 |
パラレルヒント
ステートメントレベルの並列ヒントが最も簡単です。
SELECT /*+ PARALLEL(8) */ first_name, last_name FROM employee emp;
オブジェクトレベルの並列ヒントは、より多くの制御を提供しますが、エラーが発生しやすくなります。開発者はオブジェクト名の代わりにエイリアスを使用することを忘れたり、オブジェクトをいくつか含めることを忘れることがあります。
SELECT /*+ PARALLEL(emp,8) */ first_name, last_name FROM employee emp;
SELECT /*+ PARALLEL(table_alias,Degree of Parallelism) */ FROM table_name table_alias;
パラレルヒントを使用せずにクエリを実行するのに100秒かかるとしましょう。同じクエリに対してDOPを2に変更すると、 理想的には並列ヒントを持つ同じクエリに50秒かかることになります。同様にDOPを4として使用する場合は25秒かかります。
実際には、並列実行は他の多くの要因に依存し、線形には拡大しません。これは、パラレル・オーバーヘッドが複数のパラレル・サーバーで実行された場合の利益よりも大きい小さな実行時間の場合に特に当てはまります。
USE_NL
ネストループを使用する。
使用法: use_nl(AB)
このヒントは、ネストされたループメソッドを使用してテーブルAとBを結合するようエンジンに要求します。これは、行ごとの比較です。ヒントは結合の順序を強制するものではなく、単にNLを求めます。
SELECT /*+use_nl(e d)*/ *
FROM Employees E
JOIN Departments D on E.DepartmentID = D.ID
APPENDヒント
"新しい行を挿入するためにDIRECT PATHメソッドを使用する"。
APPEND
ヒントは、 ダイレクト・パス・ロードを使用するようにエンジンに指示します 。つまり、エンジンはメモリー構造と標準ロックを使用する従来の挿入を使用しませんが、データを表スペースに直接書き込むことになります。常にテーブルのセグメントに追加される新しいブロックを作成します。これは高速ですが、いくつかの制限があります:
- トランザクションをコミットまたはロールバックするまで、同じセッションで追加したテーブルを読み取ることはできません。
- 表にトリガが定義されている場合、Oracle はダイレクト・パスを使用しません (sqlldrロードの場合は別の話です)。
- その他
例。
INSERT /*+append*/ INTO Employees
SELECT *
FROM Employees;
USE_HASH
ハッシュメソッドを使用して、引数のテーブルを結合するようにエンジンに指示します。
使用法: use_hash(TableA [TableB] ... [TableN])
多くの 場所で説明されて いるように 、「HASH結合では、Oracleは結合された結果のうち小さい方の表にアクセスし、結合キーのハッシュ・テーブルをメモリーに作成します。 1)、それにマッチするハッシュテーブルを調べます。
テーブルが大きい場合、インデックスが手近でない場合などは、ネストループメソッドに対して優先されます。
注意 :ヒントは結合の順序を強制するものではなく、単にハッシュ結合メソッドを要求します。
使用例:
SELECT /*+use_hash(e d)*/ *
FROM Employees E
JOIN Departments D on E.DepartmentID = D.ID
FULL
FULLヒントは、索引を使用できるかどうかにかかわらず、指定された表に対してフル・テーブル・スキャンを実行するようOracleに指示します。
create table fullTable(id) as select level from dual connect by level < 100000;
create index idx on fullTable(id);
ヒントがない場合は、インデックスが使用されます。
select count(1) from fullTable f where id between 10 and 100;
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 3 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 13 | | |
|* 2 | INDEX RANGE SCAN| IDX | 2 | 26 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
FULLヒントはフルスキャンを強制します:
select /*+ full(f) */ count(1) from fullTable f where id between 10 and 100;
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 47 (3)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 13 | | |
|* 2 | TABLE ACCESS FULL| FULLTABLE | 2 | 26 | 47 (3)| 00:00:01 |
--------------------------------------------------------------------------------
結果キャッシュ
Oracle( 11g以上 )では、SQLクエリをSGAにキャッシュして再利用してパフォーマンスを向上させることができます。データベースではなくキャッシュからデータを照会します。後で同じクエリを実行すると、データがキャッシュから取得されるため、より高速に実行できます。
SELECT /*+ result_cache */ number FROM main_table;
出力 -
Number
------
1
2
3
4
5
6
7
8
9
10
Elapsed: 00:00:02.20
もう一度同じクエリを実行すると、最初の実行時に設定されたキャッシュからデータが取得されるため、実行時間が短縮されます。
出力 -
Number
------
1
2
3
4
5
6
7
8
9
10
Elapsed: 00:00:00.10
どのように経過時間が2.20秒から0.10秒に短縮されたかに注目してください。
結果キャッシュは、データベース内のデータが更新/変更/削除されるまでキャッシュを保持します。変更によってキャッシュが解放されます。