JOIN効率を考慮したOUTER JOINの記述方法について

以下の例にあるようなSQL文において、TBL_Bに対してJOIN効率を考慮して抽出条件を記述すべきであると考えますが、OUTER JOINではON探索条件とWHERE句のどちらに記述すればよいですか?
また、WHERE句に日付抽出条件を指定したとき(1)、JOIN結果としてのTBL_Bの日付がNULL(TBL_Bにレコードなし)の場合、レコードが抽出されないということはありますか?

[SQL文の例]

 SELECT.....
 FROM TBL_A LEFT OUTER JOIN TBL_B
 ON TBL_A.基準日 = 19990930

 AND TBL_A.基準日 = TBL_B.基準日
 AND TBL_A.店番 = TBL_B.店番
 AND TBL_A.取引先番号 = TBL_B.取引先番号
 WHERE TBL_A.基準日 = 19990930...(1)

 AND TBL_B.基準日 = 19990930  
TBL_Bについても、ON探索条件とWHERE句の探索条件とでは意味が変わります。

  • ON探索条件
    表と表を結合するときの条件として働きます。なお、TBL_Bの抽出条件がON探索条件に記述される場合、その条件が偽のときはTBL_Bの列にはNULL値を設定するという意味であることから、その条件範囲外のレコードは結合時には必要ないという意味になります。すなわち、TBL_Bからレコードを抽出する必要がないので、検索範囲外となります。Symfoware Serverでは、その条件がDSIを限定するような条件であれば、DSI検索範囲を絞って検索します。


  • WHERE句の探索条件
    FROM句に記述される表からレコードを抽出するときの条件として働きます。すなわち、TBL_Bの抽出条件が記述される場合、それがNULL以外を抽出するような条件(例えば、(1)の条件)であれば、実はOUTER JOINではなく、INNER JOINになります。


Symfoware Serverでは、このようなSQL文においては、INNER JOINに変換して、アクセスプランを作成しています。WHERE句の条件がNULLのものを抽出する(例えば、WHERE TBL_B.店番 IS NULL、TBL_AにはあるがTBL_Bにはないもの)という条件のときは、OUTER JOINが必要なため、INNER JOINへの変換を行わず、結合表からの抽出条件として条件評価しています。
なお、そのWHERE句の条件は、TBL_Bを検索するときの(OUTER結合する前の)条件としては使えないので使っていません。
このように、WHERE句の探索条件は、TBL_Aの条件とTBL_Bの条件とは違った意味を持っています。したがって、もし、TBL_Bから抽出するレコードを「基準日=19990930」にしたいのであれば、ON探索条件に記述すると性能をよくなります。ただし、ON探索条件に抽出条件を記述するときは気をつけて(ON探索条件に記述しても結果が同じかどうかを考えて)、記述してください。

製品・サービス区分 Symfoware
製品・サービス情報
対象製品 Symfoware Server (Native Interface)
プラットフォーム Windows, Solaris, Linux
アンサー種別 設計/開発
このページの先頭へ