ホームページ >データベース >mysql チュートリアル >SQL クエリで CROSS APPLY が INNER JOIN よりも優れているのはどのような場合ですか?

SQL クエリで CROSS APPLY が INNER JOIN よりも優れているのはどのような場合ですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-20 11:37:10863ブラウズ

When Does CROSS APPLY Outperform INNER JOIN in SQL Queries?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。