Oracle SQLチューニングの基本は実行計画を理解することです。実行計画はツリー構造で、様々なオペレーションから構成されます。
この記事では、MERGE JOIN オペレーションについて説明します。
MERGE JOIN オペレーションとはどのようなオペレーションか?
結合条件に非等価条件を使用した場合に使用されやすい結合処理である、ソートマージ結合(SORT MERGE JOIN)の実行時に使用されるオペレーションです。
ソートマージ結合は、
結合対象の2つの表を結合キーでソートしておき、それぞれの列をソート済みの結合キーでマージすることで結合処理を行う結合方法です。
ソートマージ結合におけるマージ処理がMERGE JOIN オペレーションに対応します。ソート処理は、SORT JOIN オペレーションに対応します。
結合条件に非等価条件を使用した場合に選択されやすいです。結合条件に等価条件を使用した場合は、ソートマージ結合の代わりにハッシュ結合が選択されるケースが多いです。
実行計画の例
SELECT cid, cname, pa.pid, pname
FROM ch, pa
WHERE ch.pid > pa.pid;
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 280 | 659K| 8 (25)| 00:00:01 |
| 1 | MERGE JOIN | | 280 | 659K| 8 (25)| 00:00:01 |
| 2 | SORT JOIN | | 8 | 16032 | 4 (25)| 00:00:01 |
| 3 | TABLE ACCESS FULL| PA | 8 | 16032 | 3 (0)| 00:00:01 |
|* 4 | SORT JOIN | | 80 | 32560 | 4 (25)| 00:00:01 |
| 5 | TABLE ACCESS FULL| CH | 80 | 32560 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------
4 - access("CH"."PID">"PA"."PID")
filter("CH"."PID">"PA"."PID")
MERGE JOIN オペレーションに関するFAQ
MERGE JOIN オペレーションが使われる条件には何がありますか?
CBOがソートマージ結合が最適な結合アルゴリズムであると判断した場合に使われます。
Oracle Databaseの結合アルゴリズムには、ネステッドループ結合、ハッシュ結合、ソートマージ結合の3種類があります。
CBOは、アクセス対象のデータ量などを勘案して最適な結合アルゴリズムを選択しますが、比較的アクセス対象のデータ量が多く、結合条件に非等価条件を使用した場合に、ソートマージ結合が選択されやすい傾向にあります。
MERGE JOIN オペレーションを使う実行計画は望ましくないですか?
アクセス対象のデータ量が多く、結合条件に非等価条件を使用した場合に、CBOはソートマージ結合を選択するようになります。
アクセス対象のデータ量が少ない場合は、CBOの判断が不適切な場合があります。CBOの判断ミスが疑われる場合は、以下の対処を試みてください。
- オプティマイザ統計情報を収集し、CBOが適切な判断を行えるようにする
- ヒントなどを用いて、ネステッドループ結合、ハッシュ結合に誘導する
MERGE JOIN オペレーションを使う実行計画に誘導するヒントは何ですか?
USE_MERGEヒントを指定します。ただし、USE_MERGEヒントを使う場合は、原則的に結合順序を指定する LEADINGヒントや ORDEREDヒントと共に使うことに注意してください。
/*+ USE_MERGE(<内部表>) LEADING(<駆動表>) */
なぜならば、USE_MERGEヒントは内部表として指定した表が、実際に内部表として選択されない限り、マージソート結合に誘導出来ないためです。このため、LEADINGヒントやORDEREDヒントで結合順序を指定して、USE_MERGEヒントで内部表として指定した表が、実際に内部表として選択されるようにします。
参考情報
キーワード
索引アクセス INDEX UNIQUE SCAN NESTED LOOPS 索引レンジ・スキャン