Oracle SQLチューニングの基本は実行計画を理解することです。実行計画はツリー構造で、様々なオペレーションから構成されます。
この記事では、MERGE JOIN CARTESIAN オペレーションについて説明します。
MERGE JOIN CARTESIAN オペレーションとはどのようなオペレーションか?
結合対象の行の総当たり的なすべての組み合わせを網羅する、直積(デカルト積)を導出する直積結合(デカルト積結合、デカルト結合)で使用されるオペレーションです。
結合SQLで結合条件を指定しないと、直積を求めることになります。
MERGE JOIN CARTESIAN オペレーションは、直積を求めるSQL(結合条件を指定しないSQL)で一般に使用されますが、例外的に、通常の結合のSQL(結合条件を指定したSQL)で使用される場合があります。
MERGE JOIN CARTESIAN オペレーションを用いて直積結合を行う場合、通常、内部表に対してBUFFER SORTオペレーションが使用されます。これは、結合対象の行の総当たり処理を行うにあたり、内部表の行をあらかじめソートしておき、処理を効率化するためです。
実行計画の例
SELECT cid, cname, pa.pid, pname FROM ch, pa;
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 640 | 1505K| 15 (0)| 00:00:01 |
| 1 | MERGE JOIN CARTESIAN| | 640 | 1505K| 15 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL | PA | 8 | 16032 | 3 (0)| 00:00:01 |
| 3 | BUFFER SORT | | 80 | 32320 | 12 (0)| 00:00:01 |
| 4 | TABLE ACCESS FULL | CH | 80 | 32320 | 2 (0)| 00:00:01 |
-----------------------------------------------------------------------------
MERGE JOIN CARTESIAN オペレーションに関するFAQ
MERGE JOIN CARTESIAN オペレーションが使われる条件には何がありますか?
直積を求めるSQL(結合条件を指定しないSQL)が実行された場合に、使用されます。
また、通常の結合のSQL(結合条件を指定したSQL)が実行された場合でも、CBOが処理の過程で直積を求めることが効率的と判断した場合、例外的に使われることがあります。
MERGE JOIN CARTESIAN オペレーションを使う実行計画は望ましくないですか?
MERGE JOIN CARTESIAN オペレーションが実現する直積結合は、負荷の高い処理です。
このため、本来、結合条件を指定すべきところで、結合条件を指定しない、いわゆるSQLのコーディングミスの場合、結合条件を指定して、MERGE JOIN CARTESIAN オペレーションの使用を回避してください。
また、通常の結合のSQL(結合条件を指定したSQL)でMERGE JOIN CARTESIAN オペレーションが使われており、この選択が適切か疑わしい場合は、以下の対処を試みてください。
- オプティマイザ統計情報を収集し、CBOが適切な判断を行えるようにする
- 不要なヒントが指定されていないかチェックし、不要なヒントを取り除く
MERGE JOIN CARTESIAN オペレーションを使う実行計画に誘導するヒントは何ですか?
USE_MERGE_CARTESIANヒントを指定します。ただし、USE_MERGE_CARTESIANヒントを指定しても、MERGE JOIN CARTESIAN オペレーションが使用されない場合があります。
参考情報
キーワード
索引アクセス INDEX UNIQUE SCAN NESTED LOOPS 索引レンジ・スキャン