SQL Join オーダリング

TDV は、SQL Join ブロック (インナー ジョインとすべての種類のアウター ジョイン) を自動的に評価して、SQL Join オーダリングを書き換えるのに適しているかどうかを判断します。Join ブロックは、一連の連続したジョインです。TDV クエリ エンジンは、クエリの各結合ブロックを個別に分析し、クエリを書き直して、データ ソースにプッシュされる結合の数を最大化しようとします。インナー ジョインは制限なく再関連付けできますが、TDV クエリ オプティマイザーは、多くの技術的なルールをチェックして、アウター ジョインを含むブロックを安全に並べ替えられるかどうかを判断します。

複雑な条件を満たすクエリの場合、TDV は、パフォーマンスの向上が見込める場合には、SQL 結合順序を書き換えます。結合は、同じデータ ソースのテーブルが最初に実行されるように並べ替えられます。これにより、プッシュダウンが最大化され、クエリの効率性が向上します。

次の例は、SQL Join オーダリングがどのように機能するかを示しています。

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

デフォルトでは Join は Left Join であるため、記述されたクエリは最初に Outer Join を実行し、次に Inner Join を実行します。このクエリのプランは次のようになります。

[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 つのテーブル間の結合が最初に実行され、オプティマイザーはこの Join をデータ ソースにプッシュダウンできます。対応するクエリ プランは次のようになります。

[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 つの Join のみを実行する必要があります。ほとんどのデータはデータ ソースで除外されるため、データ転送が減少します。TDV は、Inner Join とすべてのタイプの Outer Join を含む Join ブロックを自動的に書き換えます。

Join ブロックは、連続する Join のセットです。クエリ エンジンは、クエリの各 Join ブロックを個別に分析し、データ ソースにプッシュダウンされる Join の数を最大化するようにクエリを書き換えようとします。Inner Join は無制限に再結合できますが、オプティマイザーは、いくつかの技術的ルールをチェックして、Outer Join を含むブロックを並べ替えても安全かどうかを判断します。Cross Join は並べ替えの対象にはなりません。Join に新しい Cross Join が導入された場合、Join の並べ替えは実行されません。ヒント付きの Join ノードは、並べ替えの対象とは見なされません。

結合順序付けアルゴリズムの前提条件は、すべての Outer Join を単純化できることです。次に例を示します。

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

Left Outer Join は Inner Join に変換できます。これは、その上の Inner Join に、Outer Join の null で埋められた側に適用される null 拒否述語があるためです。一番上の Join の ON 句は、O100BIN_FLOAT 列に NULL がある、Left Outer Join によって生成された行をすべて拒否します。

このクエリのプランは次のようになります。

[1] Request #3040
[2] + SELECT   (2) 
[3]   + JOIN  (2)
[4]     + JOIN  (1)
[5]     | + FETCH   (10) [Oracle2]
[6]     | + FETCH   (89) [Oracle]
[7]     + FETCH   (2) [Oracle]

これは、Left Outer Join が Inner Join に変換されたものの、Join ヒントが (入力クエリの) Inner Join を並べ替えられないことを暗示しているため、Join の並べ替えが行われなかったことを示しています。

TDV は SQL Join オーダリング分析を自動的に実行します。特殊な構成または SQL オプションが必要になるのは、テーブルの構築またはテーブルの関係が必要なために、記述されているとおりに SQL 処理を実行する必要がある場合のみです。

テーブルは任意の順序でジョインできます (「ビューとテーブル リソース」を参照)。

ジョイン オーダリングの実施

テーブルをジョインした順序に従うようにクエリ エンジンを指定できます。ジョインを指定する方法については、「ビューとテーブル リソース」を参照してください。