Mysql
 sql >> Base de données >  >> RDS >> Mysql

L'ordre des tables dans les jointures droites, sans directives d'indication, affecte-t-il les performances ?

Réponse à votre question - Oui, l'ordre de la table fait la différence dans la jointure.

Vous pouvez également informer l'optimiseur du plan d'exécution.

L'indicateur ORDERED oblige Oracle à joindre les tables dans l'ordre dans lequel elles apparaissent dans la clause FROM.

Par exemple, cette instruction joint la table TAB1 à la table TAB2 puis joint le résultat à la table TAB3 :

 SELECT /*+ ORDERED */ TAB1.COL1, TAB2.COL2, TAB3.COL3
     FROM TAB1, TAB2, TAB3
    WHERE TAB1.COL1 = TAB2.COL1
         AND TAB2.COL1 = TAB3.COL1;

Si vous omettez l'indicateur ORDERED d'une instruction SQL effectuant une jointure, l'optimiseur choisit l'ordre dans lequel joindre les tables. Vous pouvez utiliser l'indicateur ORDERED pour spécifier un ordre de jointure si vous savez quelque chose sur le nombre de lignes sélectionnées dans chaque table que l'optimiseur ne connaît pas. De telles informations vous permettraient de choisir une table interne et externe mieux que ne le pourrait l'optimiseur.

Habituellement, si vous analysez les tables, l'optimiseur sélectionne un plan en étoile efficace. Vous pouvez également utiliser des conseils pour améliorer le plan. La méthode la plus précise consiste à classer les tables dans la clause FROM dans l'ordre des clés de l'index, avec la grande table en dernier. Utilisez ensuite les conseils suivants :

/*+ ORDERED USE_NL(FACTS) INDEX(FACTS FACT_CONCAT) */