CROSS APPLY と INNER JOIN: CROSS APPLY が有効になるのはどのような場合ですか?
ほとんどの 1 対多の関係では INNER JOIN
が頼りになりますが、CROSS APPLY
は特定の状況でパフォーマンスに大きな利点をもたらします。
CROSS APPLY の主な利点:
INNER JOIN
とは異なり、CROSS APPLY
は右側のテーブルにユーザー定義関数 (UDF) を要求しません。この一見小さな違いは、パーティショニングやページネーションが必要な大規模なデータセットを処理する場合に重要になります。
パーティショニングとページネーションの優位性:
INNER JOIN
と CROSS APPLY
を使用した単純なクエリでも同様の実行プランが生成される可能性がありますが、パーティショニングやページネーションが必要な大規模なデータセットでは、CROSS APPLY
の方が優れた効率性を示します。 明示的な JOIN
条件を排除することで、データベース オプティマイザーがキャッシュされた中間結果を利用できるようになり、クエリの実行が高速化されます。
例:
次のクエリは、左側のテーブルの行ごとに右側のテーブルを複数回反復する場合に、CROSS APPLY
よりも INNER JOIN
が優れていることを示しています。
<code class="language-sql">/* CROSS APPLY */ SELECT t1.*, t2o.* FROM t1 CROSS APPLY ( SELECT TOP 3 * FROM t2 WHERE t2.t1_id = t1.id ORDER BY t2.rank DESC ) t2o</code>
このクエリは、各 t2
行の上位 3 つの t1
レコードを効率的に取得します。 INNER JOIN
を使用してこの機能を複製すると、大幅に複雑になり、効率が低下します。
パフォーマンスベンチマーク:
20,000,000 レコードのテーブルでのテストでは劇的な違いが示されました。CROSS APPLY
はほぼ瞬時に実行されましたが、CTE とウィンドウ関数を使用した同等の INNER JOIN
クエリには約 30 秒かかりました。
要約:
CROSS APPLY
は、明示的な JOIN
条件が利用できない場合、または大規模なデータセットのパーティション化やページネーションを扱う場合に優れた選択肢です。 このようなシナリオでの効率性により、クエリ最適化のための非常に貴重なツールとなります。
以上が最適なパフォーマンスを得るには、どのような場合に INNER JOIN ではなく CROSS APPLY を選択する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。