Lequel est le plus rapide – jointures ou sous-requêtes?


Meilleure réponse

Bien que les jointures et les sous-requêtes aient leur place dans les instructions SQL, jessaie personnellement toujours décrire mes requêtes en utilisant exclusivement des jointures . Pendant ce temps, je nintroduis une sous-requête que lorsque je ne peux pas récupérer les données que je veux sans une.

La raison en est que les jointures ont tendance à sexécuter plus rapidement. En fait, jirais jusquà dire que le temps de récupération de la requête utilisant des jointures sera presque toujours plus rapide que celui dune sous-requête.

La raison en est que les jointures allègent la charge de calcul sur le base de données en remplaçant plusieurs requêtes par une seule requête de jointure. Cela permet à son tour de mieux utiliser les capacités de la base de données à rechercher, filtrer et trier les enregistrements.

Bien sûr, lorsque vous ajoutez plus de jointures à une requête, le serveur de base de données doit faire plus de travail, ce qui se traduit par afin de ralentir les temps de récupération des données.

Bien que les jointures soient nécessaires pour récupérer des données à partir dune base de données normalisée, il est important que les jointures soient écrites correctement, car des jointures incorrectes peuvent entraîner une sérieuse dégradation des performances et des résultats de requête inexacts.

Dans certains cas, les sous-requêtes peuvent remplacer les jointures et unions complexes avec un effet négatif minimal sur les performances.

Exemples de sous-requêtes

Parfois, vous ne pouvez pas vraiment vous déplacer en utilisant une sous-requête. Voici quelques exemples utilisant lexemple de base de données Sakila pour MySQL et mon client de développement et dadministration de base de données Navicat .

Exemple 1: Utilisation dune fonction dagrégation dans le cadre dune clause JOIN

La plupart du temps, les tables sont jointes sur un champ commun. En fait, il n’est pas inhabituel que le champ commun partage également le même nom pour montrer qu’il s’agit des mêmes données. Cependant, dans la requête suivante, la table client est jointe à la dernière (MAX) create\_date afin que les résultats de la requête soient pour le client qui sest inscrit le plus récemment.

Une sous-requête est utilisée car vous ne pouvez pas utiliser les fonctions dagrégation dans le cadre dune clause WHERE. Cette solution de contournement ingénieuse contourne cette limitation!

Exemple n ° 2:

Dans cette requête, une sous-requête est utilisée pour récupérer un jeu de résultats intermédiaire afin que nous puissions appliquer la fonction AVG () au COUNT de films loués. Cest ce que jappelle une double agrégation car nous appliquons une agrégation (AVG) au résultat dun autre (COUNT).

Cette requête particulière est assez rapide – ne prend que 0,044 seconde – car la requête interne renvoie une valeur unique. En général, les requêtes les plus lentes sont celles qui nécessitent une analyse complète de la table.

Jespère que cela répond à votre question.

Cordialement!

Adam

Réponse

Habituellement, vous devez rédiger les requêtes pour être aussi clair que possible et laisser loptimisation au processeur de requêtes du SGBDR et au DBA, si vous en avez un, qui est responsable du réglage de la conception physique. devrait aboutir à des performances assez bonnes dans la plupart des cas, mais il y a des exceptions. Parfois, loptimiseur de requêtes dun SGBDR a des angles morts ou de mauvais cas.

Maintenant, si des jointures ou des sous-requêtes vont être un problème pour un optimiseur, il est beaucoup plus probable que ce soit dans des sous-requêtes. Cest parce que la jointure est une fonctionnalité de base du langage que tout le monde utilise, alors que de nombreux utilisateurs nutilisent pas du tout de sous-requêtes. Jai trouvé dans cette conversion une application de Sybase vers SQL Server, j’ai dû réécrire de nombreuses sous-requêtes sous forme de jointures en raison de bogues dans Microsoft « s gestion des sous-requêtes – bien que dans un cas très spécifique (où la sous-requête where clause incluait un paramètre lié). Il nest pas surprenant que SQL Server ait eu des bogues dans les sous-requêtes, car un grand nombre de ses clients utilisent SQL Server avec les éditeurs de requêtes graphiques de Microsoft qui produisent naturellement des jointures mais pas des sous-requêtes.

Je déconseille généralement loptimisation prématurée, mais je ferai une exception ici. Si votre application doit être portable sur plusieurs plates-formes de bases de données, je préférerais les jointures aux sous-requêtes dans la plupart des cas, car vous risquez davantage de rencontrer des bogues ou de mauvais choix d’optimiseur avec des sous-requêtes. Si votre lapplication na pas besoin dêtre portable, écrivez la requête de la manière la plus naturelle et sil ny a pas de problème – ce qui sera la plupart du temps – très bien. Sil y a un problème, réécrivez la requête différemment pour voir si cela aide. Et si vous avez un DBA, consultez-le pour tout problème de performances que vous rencontrez.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *