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
Libérer: 2025-01-20 11:37:10
original
862 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal