ホームページ >データベース >mysql チュートリアル >SQL クエリで CROSS APPLY が INNER JOIN よりも優れているのはどのような場合ですか?
質問:
SQL クエリで、INNER JOIN より CROSS APPLY を使用した方が効率的なのはどのような場合ですか?これらは多対 1 の関係では同等に見えますが、CROSS APPLY のパフォーマンス上の利点の例を見つけるのは困難です。
答え:
複雑な接続における CROSS APPLY の利点:
CROSS APPLY は、結合テーブルに INNER JOIN では簡単に表現できない複雑な条件がある場合に利点を発揮します。次の例を考えてみましょう:
<code class="language-sql">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>
このクエリは、t1 の各レコードに対して t2 の最新の 3 つのレコードを取得します。これは INNER JOIN では簡単に実現できません。
CTE と CROSS APPLY のパフォーマンス比較:
CROSS APPLY の代替方法は、ウィンドウ関数で共通テーブル式 (CTE) を使用することです。
<code class="language-sql">WITH t2o AS ( SELECT t2.*, ROW_NUMBER() OVER (PARTITION BY t1_id ORDER BY rank) AS rn FROM t2 ) SELECT t1.*, t2o.* FROM t1 INNER JOIN t2o ON t2o.t1_id = t1.id AND t2o.rn <= 3</code>
ただし、この方法は可読性が低く、場合によっては効率が低下する可能性があります。
例:
パフォーマンスの違いを説明するために、次のクエリを考えてみましょう:
<code class="language-sql">-- 使用 CTE WITH q AS ( SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS rn FROM master ), t AS ( SELECT 1 AS id UNION ALL SELECT 2 ) SELECT * FROM t JOIN q ON q.rn <= t.id -- 使用 CROSS APPLY WITH t AS ( SELECT 1 AS id UNION ALL SELECT 2 ) SELECT * FROM t CROSS APPLY ( SELECT TOP (t.id) m.* FROM master m ORDER BY id ) q</code>
約 20,000,000 レコードを持つテーブルでは、CTE クエリの実行には 30 秒近くかかりますが、CROSS APPLY クエリはすぐに完了します。
以上がSQL クエリで CROSS APPLY が INNER JOIN よりも優れているのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。