ユーザーガイド > パフォーマンスチューニング > 複数の結合条件
 
複数の結合条件
ソース側に多数の行があり、ターゲット側に非常に長いSQL文字列が生成される場合、TDVクエリーエンジンは次のいずれかの方法でそのSQL文字列を処理します。
パーティション分割された半結合 — TDVクエリーエンジンは、ターゲット側の述語を複数のチャンクに分割し、チャンクごとに1つのクエリーをターゲット側に送信します。この手法は、ON句が接続詞を使用するか、単一の述語であるかに関係なく、またターゲット側のSQLがIN句またはOR構文を使用しているかどうかに関係なく適用されます。パーティション分割された半結合は、非等価条件を含む半結合クエリーにも適用されます。
クエリー述語の書き換え — 結合のON句に接続詞があり、ターゲット側のデータソースで行コンストラクター形式のIN句がサポートされていない場合、TDV Serverは、次のようなIN句を使用してターゲット側の行コンストラクター形式を生成しません。
(t1,t2) IN ((1,2), (6,3), (8,4),(93,3)…)
 
その代わりに、次のような2つ以上のスカラーIN句を含む述語を生成する場合があります。
t1 IN (1,6,8,93") and t2 IN (2,3,4,3,…).
 
スカラーIN句の構文はOR構文よりもコンパクトであるため、ターゲットデータソースでパーティション分割された半結合とロードが実行される可能性が低下します。ただし、この述部はOR形式ほど選択的ではないため、TDVにより多くの行が取り込まれる可能性があります。このトレードオフのため、エンジンがOR構文から複数のスカラーIN句構文に切り替える行数をソース側で構成できます。
次のより複雑な例を考えてみましょう。
SELECT * from DS1.R LEFT OUTER JOIN DS2.T on R.r1 = T.t1 and R.r2 = T.t2
 
この場合、TDV Serverのクエリーエンジンは、T側に次の形式の追加の述語(行コンストラクター形式のIN句)を生成する場合があります。
(t1,t2) IN ((1,2), (6,3), (8,4), (93,3)…)
 
DS2ターゲットでこの形式のIN句のクエリーフレージングがサポートされている場合は、この述語が優先されます。
データソースでこの形式のIN句がサポートされていない場合、追加の述語は次のようになります。
(t1=1 and t2=2) or (t1=6 and t2=3) or (t1=8 and t2=4) or …)
 
2番目の形式は論理的にIN句形式と同じですが、右側で多数の行が生成されると、DS2の処理能力を超える長いSQL文字列がターゲット側で生成される可能性があります。
複数の述語がある左外部結合のプッシュ — クエリーエンジンがON句とWHERE句に基づいて選択可能なデータを事前に決定できる場合は、クエリーをデータソースにプッシュします。例:
SELECT
O10_Id
O10_CHAR
S_Id
S_CHAR
FROM /users/eg/t1 left outer { option semijoin=”false”, hash } join /users/sqlsr/5kk
ON O10_Id = S_Id
WHERE O10_Id = 9
 
この例では、WHERE句の述語がON句の述語と同じであるため、O10_Id = 9をデータソースにプッシュできます。これにより、返されるデータの量を大幅に減らすことができます。