Maison >base de données >tutoriel mysql >Quand CROSS APPLY surpasse-t-il INNER JOIN dans les requêtes SQL ?

Quand CROSS APPLY surpasse-t-il INNER JOIN dans les requêtes SQL ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-20 11:37:10863parcourir

When Does CROSS APPLY Outperform INNER JOIN in SQL Queries?

Quand CROSS APPLY est-il meilleur que INNER JOIN dans les requêtes SQL ?

Question :

Dans une requête SQL, quand est-il plus efficace d'utiliser CROSS APPLY que INNER JOIN ? Bien qu'ils semblent équivalents dans les relations plusieurs-à-un, les exemples des avantages en termes de performances de CROSS APPLY sont difficiles à trouver.

Réponse :

Avantages du CROSS APPLY dans les connexions complexes :

CROSS APPLY montre ses avantages lorsque la table jointe présente des conditions complexes qui ne peuvent pas être facilement exprimées avec INNER JOIN. Prenons l'exemple suivant :

<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>

Cette requête récupère les trois enregistrements les plus récents de t2 pour chaque enregistrement de t1. Cela ne peut pas être facilement réalisé avec INNER JOIN.

Comparaison des performances entre CTE et CROSS APPLY :

Une alternative à CROSS APPLY consiste à utiliser une expression de table commune (CTE) avec une fonction de fenêtre :

<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>

Cependant, cette méthode est moins lisible et peut être moins efficace dans certains cas.

Exemple :

Pour illustrer la différence de performances, considérons la requête suivante :

<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>

Sur une table contenant environ 20 000 000 d'enregistrements, la requête CTE prend près de 30 secondes à s'exécuter, tandis que la requête CROSS APPLY se termine immédiatement.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn