V6R1以前のDB2 for IBM i で FULL OUTER JOIN を実行するには

DB2 for IBM i では、完全外部結合について V6R1 から FULL OUTER JOIN という構文で記述できるようになっています。

V6R1 での実行

V6R1 のマシンで、FULL OUTER JOIN を使用した SQL を実行してみると …

(当り前ですが)実行でき、正しい結果が出ていることが確認できます。

Visual Explain を見てみましょう。

まったく同型の、テーブル・スキャンとインデックス検索とのネステッド・ループ結合が 2つ、UNION ALL で結合されて最終結果を出していることが、左側のペインに描出されているアクセスプランのモデルからわかります。

実は、ヴェン図を描いてみるとわかることなのですが、

↑で実行した

 SELECT EMPNO, LASTNAME, DEPTNAME        
   FROM SAMPLE.EMPLOYEE XXX     
   FULL OUTER JOIN SAMPLE.DEPARTMENT YYY  
   ON XXX.WORKDEPT = YYY.DEPTNO;

という SQL は、↓のように書きかえた SQL とまったく同じデータ集合を表現している、というわけで、

 SELECT EMPNO, LASTNAME, DEPTNAME        
  FROM SAMPLE.EMPLOYEE XXX
  LEFT OUTER JOIN SAMPLE.DEPARTMENT YYY
  ON XXX.WORKDEPT = YYY.DEPTNO
 UNION ALL 
 SELECT EMPNO, LASTNAME, DEPTNAME        
  FROM SAMPLE.DEPARTMENT YYY    
  LEFT EXCEPTION JOIN SAMPLE.EMPLOYEE XXX       
  ON XXX.WORKDEPT = YYY.DEPTNO;

それが Visual Explain に表現されている、ということなのです。

書き換えられた例の方を、V5R3 のマシンで実行してみましょう。

V5R3 での実行

一番最初に紹介した V6R1 での FULL OUTER JOIN の実行例と同じ結果が出ていることが確認できます。

V5R3 での実行結果の Visual Explain を見てみると、まったく同じプランになっていることが確認できます。

つまり、V5R4/V5R3 の DB2 for IBM i は構文としては FULL OUTER JOIN はサポートしていないものの、SQL を書き換えることで対応可能だ、ということですね。

アクセス・プランがまったく同じであることからわかるように、単純に SQL の構文解析のところで V6R1では FULL OUTER JOIN がサポートされるようになった、ということなので、パフォーマンスや信頼性についても、どちらのバージョンでも大きな違いがあるとは考えにくいですね。

V6R1 では安心してFULL OUTER JOIN を使えばいいでしょうし、
V5R4/V5R3 でもFULL OUTER JOIN という構文が使えないからといっても、同じデータ集合を得ることのできる SQL は存在していますので、あきらめたり(?!) しないようにしていただければいいな、と思います。

[Top Pageに戻る]

Ads by TOK2