ユーザーガイド > パフォーマンスチューニング > SQL結合の並べ替え
 
SQL結合の並べ替え
TDVは、SQL結合ブロック(内部結合およびすべてのタイプの外部結合)を自動的に評価して、SQL結合順序の書き換えに適しているかどうかを判断します。結合ブロックは、連続する結合のセットです。TDVクエリーエンジンは、クエリーの各結合ブロックを個別に分析し、データソースにプッシュダウンされる結合の数を最大化するようにクエリーを書き換えようとします。内部結合は無制限に再結合できますが、TDVクエリーオプティマイザーは、いくつかの技術的ルールをチェックして、外部結合を含むブロックを並べ替えても安全かどうかを判断します。
複雑な条件を満たすクエリーの場合、TDVは、パフォーマンスの向上が見込める場合には、SQL結合順序を書き換えます。結合は、同じデータソースのテーブルが最初に実行されるように並べ替えられます。これにより、プッシュダウンが最大化され、クエリーの効率性が向上します。
次の例は、SQL結合の順序付けがどのように機能するかを示しています。
SELECT O10BIN_ID, O100BIN_ID, O1KBIN_ID
FROM /users/composite/test/sources/oracleA/QABIN/O10BIN RIGHT OUTER JOIN
/users/composite/test/sources/oracle/QABIN/O100BIN
ON O10BIN_NUMBER1 = O100BIN_NUMBER1 INNER JOIN
/users/composite/test/sources/oracle/QABIN/O1KBIN
ON O100BIN_FLOAT = O1KBIN_FLOAT
 
デフォルトでは結合は左結合であるため、記述されたクエリーは最初に外部結合を実行し、次に内部結合を実行します。このクエリーのプランは次のようになります。
[1] Request #2511
[2] + SELECT (13)
[3] + JOIN (13)
[4] + RIGHT OUTER JOIN (100)
[5] | + FETCH (10) [Oracle2]
[6] | + FETCH (100) [Oracle]
[7] + FETCH (1000) [Oracle ]
 
括弧内の数字は、各演算子によって生成される行の数を表しています。角括弧内の注釈はデータソース名です。
同じクエリーを次のように書き換えるすことができます。
SELECT O10BIN_ID, O100BIN_ID, O1KBIN_ID
FROM /users/composite/test/sources/oracle2/QABIN/O10BIN RIGHT OUTER JOIN
(/users/composite/test/sources/oracle/QABIN/O100BIN INNER JOIN
/users/composite/test/sources/oracle/QABIN/O1KBIN
ON O100BIN_FLOAT = O1KBIN_FLOAT)
ON O10BIN_NUMBER1 = O100BIN_NUMBER1
 
同じデータソースの2つのテーブル間の結合が最初に実行され、オプティマイザーはこの結合をデータソースにプッシュダウンできます。対応するクエリープランは次のようになります。
[1] Request #2533
[2] + SELECT (13)
[3] + RIGHT OUTER JOIN (13, 9%)
[4] + FETCH (10, 36%) [Oracle 2]
[5] + FETCH (13, 59%) [Oracle]
 
TDVは、1つの結合のみを実行する必要があります。ほとんどのデータはデータソースで除外されるため、データ転送が減少します。TDVは、内部結合とすべてのタイプの外部結合を含む結合ブロックを自動的に書き換えます。
結合ブロックは、連続する結合のセットです。クエリーエンジンは、クエリーの各結合ブロックを個別に分析し、データソースにプッシュダウンされる結合の数を最大化するようにクエリーを書き換えようとします。内部結合は無制限に再結合できますが、オプティマイザーは、いくつかの技術的ルールをチェックして、外部結合を含むブロックを並べ替えても安全かどうかを判断します。クロス結合は並べ替えの対象にはなりません。結合に新しいクロス結合が導入された場合、結合の並べ替えは実行されません。ヒント付きの結合ノードは、並べ替えの対象とは見なされません。
結合順序付けアルゴリズムの前提条件は、すべての外部結合を単純化できることです。次に例を示します。
SELECT O10BIN_ID, O100BIN_ID, O1KBIN_ID
FROM /users/composite/test/sources/oracle2/QABIN/O10BIN LEFT OUTER JOIN
/users/composite/test/sources/oracle/QABIN/O100BIN
ON O10BIN_NUMBER1 = O100BIN_NUMBER1 INNER {OPTION SEMIJOIN} JOIN
/users/composite/test/sources/oracle/QABIN/O1KBIN
ON O100BIN_FLOAT = O1KBIN_FLOAT
 
左外部結合は内部結合に変換できます。これは、その上の内部結合に、外部結合のnullで埋められた側に適用されるnull拒否述語があるためです。一番上の結合のON句は、O100BIN_FLOAT列にNULLがある、左外部結合によって生成された行をすべて拒否します。
このクエリーのプランは次のようになります。
[1] Request #3040
[2] + SELECT (2)
[3] + JOIN (2)
[4] + JOIN (1)
[5] | + FETCH (10) [Oracle2]
[6] | + FETCH (89) [Oracle]
[7] + FETCH (2) [Oracle]
 
これは、左外部結合が内部結合に変換されたものの、結合ヒントが(入力クエリーの)内部結合を並べ替えられないことを暗示しているため、結合の並べ替えが行われなかったことを示しています。
TDVは、SQL結合の並べ替え分析を自動的に実行します。特別な構成またはSQLオプションは、テーブルの構築またはテーブルの関係が必要なために、SQL処理を記述どおりに強制する場合にのみ必要です。
テーブルは任意の順序で結合できます(ビューおよびテーブルリソースを参照してください)。
結合順序付けの強制
テーブルを結合した順序に従うようにクエリーエンジンに指示できます。結合を指定する方法については、「ビューおよびテーブルリソース」を参照してください。