3 votes

Optimisation des UNION SQL

J'ai 4 tables nommées A1, A2, B1, B2.

Pour répondre à une exigence, j'ai deux façons d'écrire des requêtes SQL. La première est la suivante :

(A1 UNION ALL A2) A JOIN (B1 UNION ALL B2) B ON A.id = B.a_id WHERE ...

Et la deuxième est :

(A1 JOIN B1 on A1.id = B1.a_id WHERE ...) UNION ALL (A2 JOIN B2 on A2.id = B2.a_id WHERE ... )

J'ai essayé les deux approches et je me suis rendu compte qu'elles donnent toutes deux le même temps d'exécution et les mêmes plans de requête dans certains cas spécifiques. Mais je ne suis pas sûr qu'elles donnent toujours les mêmes performances ou non.

Ma question est donc de savoir quand la première ou la deuxième est la meilleure en termes de performances ?

En termes de codage, je préfère la première car je peux créer deux vues sur (A1 UNION ALL A2) ainsi que (B1 UNION ALL B2) et les traiter comme deux tables.

1voto

Stephen Butler Points 31

D'un point de vue purement fonctionnel, et sans savoir ce que contiennent les tables, la première semble meilleure - si les données correspondent dans a1 et b2, votre deuxième requête ne les joindra pas.

1voto

xt.and.r Points 187

Le second est meilleur :

(A1 JOIN B1 on A1.id = B1.a_id WHERE ...) UNION ALL (A2 JOIN B2 on A2.id = B2.a_id WHERE ... )

Il donne plus d'informations à l'optimiseur Oracle CBO sur la façon dont vos tables sont liées les unes aux autres. CBO peut calculer plus précisément les coûts des plans potentiels. Il s'agit de la cardinalité, des statistiques des colonnes, etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X