Maison >base de données >tutoriel mysql >Quand CROSS APPLY surpasse-t-il 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!