La Performance de imbriquée sélectionnez

Je sais que c'est une question commune et j'ai lu plusieurs autres postes et des papiers, mais je ne pouvais pas en trouver un qui prend en compte les champs indexés et le volume des dossiers que les deux requêtes pourraient revenir.

Ma question est simple, vraiment. Lequel des deux est recommandé ici, écrit dans une syntaxe de type SQL (en termes de performances).

Première requête:

Select *
from someTable s
where s.someTable_id in
                    (Select someTable_id 
                     from otherTable o
                     where o.indexedField = 123)

Deuxième requête:

Select *
from someTable
where someTable_id in
                  (Select someTable_id 
                   from otherTable o
                   where o.someIndexedField = s.someIndexedField
                   and o.anotherIndexedField = 123)

Ma compréhension est que la deuxième requête de requête de la base de données pour chaque n-uplet que la requête externe sera de retour où la première requête évaluer l'intérieure de la sélectionner, puis appliquer le filtre de la requête externe.

Maintenant la deuxième requête peut interroger la base de données ultra-rapides en considérant que la someIndexedField champ est indexé, mais dire que nous avons des milliers ou des millions d'enregistrements ne serait-il pas plus rapide d'utiliser la première requête?

Remarque: Dans une base de données Oracle.

. . En général, une performance de question sans spécifier la base de données est vide de sens. SQL est un langage de description, pas une langue de la procédure, de sorte que l'optimiseur (une partie du moteur) est libre de choisir n'importe quel plan de requête est le meilleur pour une requête donnée.
Bon point. La base de données est une base de données Oracle. La langue ne devrait pas vraiment d'importance, je suppose juste écrit-il dans un SQL syntaxe.
. . Selon Tom Kyte, l'optimiseur Oracle est assez intelligent pour reconnaître les sous-requêtes corrélées et de les transformer en les jointures appropriées (asktom.oracle.com/pls/apex/...). Oracle a une très bonne optimiseur. Ce qui est amusant, c'est que la première version a totalement aweful les performances de MySQL . . . jusqu'à la version 5.6 qui a réglé le problème.

OriginalL'auteur mixkat | 2013-07-04