Question

Existe-t-il des règles générales permettant aux développeurs d'utiliser la jointure au lieu de la sous-requête ou sont-ils les mêmes?

Était-ce utile?

La solution

Dépend du SGBDR. Vous devez comparer les plans d'exécution pour les deux requêtes.

D'après mon expérience avec Oracle 10 et 11, les plans d'exécution sont toujours les mêmes.

Autres conseils

Le premier principe est "énoncez la requête avec précision". Le second principe est "énoncez la requête simplement et évidemment" (c'est là que vous faites habituellement des choix). Le troisième est "énoncez la requête pour qu'elle traite efficacement".

Si c'est un dbms avec un bon processeur de requêtes, des conceptions de requêtes équivalentes devraient aboutir à des plans de requête identiques (ou au moins tout aussi efficaces).

Ma première frustration lors de l’utilisation de MySQL pour la première fois a été de prendre conscience de l’anticipation de l’optimiseur. Après une longue expérience avec Oracle, SQL Server, Informix et d’autres produits dbms, j’ai rarement prévu de me préoccuper de ces problèmes. C’est mieux maintenant avec les nouvelles versions de MySQL, mais c’est toujours une chose à laquelle je dois faire attention plus souvent qu’avec les autres.

En termes de performances, ils n’ont aucune différence dans les moteurs de base de données les plus modernes.

Le problème avec les sous-requêtes est que vous pourriez avoir un sous-jeu de résultats sans aucune clé. Par conséquent, les joindre serait plus coûteux.

Si possible, essayez toujours de faire des requêtes JOIN et de filtrer avec la clause ON au lieu de WHERE (bien que ce soit la même chose, car les moteurs modernes sont optimisés pour cela).

Théoriquement, chaque sous-requête peut être remplacée par une requête de jointure.

Comme pour beaucoup de choses, cela dépend. - quelle est la complexité de la sous-requête - dans une requête à quelle fréquence la sous-requête est-elle exécutée

J'essaie d'éviter les sous-requêtes chaque fois que je peux. Surtout lorsque vous attendez de grands ensembles de résultats, n'utilisez jamais de sous-requêtes - au cas où la sous-requête serait exécutée pour chaque élément de l'ensemble de résultats.

prendre soin, Alex

Ignorons l'impact sur les performances pour le moment (comme nous devrions le faire si nous sommes conscients que "l'optimisation prématurée est la racine de tous les maux").

Choisissez ce qui semble plus clair et plus facile à gérer.

Dans SQL Server, une sous-requête corrélée est généralement moins performante qu'une jointure, voire souvent meilleure, que celle d'une jointure à une table dérivée. Je n'écris presque jamais une sous-requête pour tout ce qui devra être exécuté plusieurs fois. En effet, les sous-requêtes corrélées transforment souvent votre requête en un curseur et exécutent une ligne à la fois. Dans les bases de données, il est généralement préférable de faire les choses à la manière d'un ensemble

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top