Je trouve ce paragraphe dans la documentation OracleOrdre des tables dans requête de jointure
si vous voulez sélectionner le nom de chaque département ainsi que le nom de son gestionnaire , vous pouvez écrire la requête dans un de deux façons. Dans le premier exemple qui suit, l'indice ++ ordonné ++/ indique que pour faire la jointure dans l'ordre, les tables apparaissent dans la clause FROM avec en essayant d'optimiser l'ordre de jointure.
SELECT /*+ordered*/ d.NAME, e.NAME FROM DEPT d, EMP e WHERE d.MGR = e.SS#
ou:
SELECT /*+ordered*/ d.NAME, e.NAME FROM EMP e, DEPT d WHERE d.MGR = e.SS#
Supposons qu'il ya 10 départements et 1000 employés, et que la table intérieure dans chaque requête a un index sur la colonne de jointure. Dans la première requête, la première table produit 10 lignes qualifiantes (dans ce cas, la table entière). Dans la deuxième requête, la première table génère 1000 lignes qualifiantes. La première requête accédera à la table EMP 10 fois et analysera la table DEPT une fois. La deuxième requête analyse une fois la table EMP , mais accède 1000 fois à la table DEPT . Par conséquent, la première requête fonctionnera beaucoup mieux. En règle , les tables doivent être disposées à partir des plus petites lignes de nombre effectif au plus grand nombre effectif de lignes . La taille de ligne effective d'une table dans une requête est obtenue par en appliquant les conditions logiques que sont résolues entièrement sur cette table.
Mais je ne comprends pas correctement cela. S'il y a m
lignes dans la table t1 et n
lignes dans la table t2, le moteur sql ne passerait-il pas par m x n
lignes dans les deux cas?
Mise à jour: Merci pour toutes les réponses. Je ne vais pas remplacer l'optimiseur, je voulais juste confirmer ma pensée.
Pouvez-vous s'il vous plaît poster un lien vers le document où vous lisez ceci? –
Il vous manque la clause 'WHERE' dans votre deuxième requête, qui se trouve dans la documentation Oracle. –
@Peter - Ajouté où clause :) – Jerry