2011-09-20 21 views
0
Both queries generates a list of department IDs along with the number 
of employees assigned to each department. 

Je suis en mesure d'obtenir des résultats pour les deux ci-dessus en utilisant des jointures et des sous-requête, mais je suis très curieux de savoir comment les deux requêtes fonctionne en termes de performance ce qui est mieux: les jointures ou sous-requête. J'ai ajouté la capture d'écran Explain Plan pour les deux requêtes, mais je ne comprends pas ce que cela signifie.Performances entre la sous-requête et la jointure?

Rejoignez l'aide

SELECT d.dept_id, d.name, count(emp_id) AS num_employee 
FROM department d INNER JOIN employee e ON e.dept_id = d.dept_id 
GROUP BY dept_id; 

enter image description here

L'utilisation des sous-requêtes

SELECT d.dept_id, d.name, e_cnt.how_many num_employees 
FROM department d INNER JOIN 
(SELECT dept_id, COUNT(*) how_many 
FROM employee 
GROUP BY dept_id) e_cnt 
ON d.dept_id = e_cnt.dept_id; 

enter image description here

+0

avez-vous testé la performance? – rabudde

+0

En règle générale - une jointure est presque toujours meilleure en termes de performance – Galz

+0

voir aussi http://dev.mysql.com/doc/refman/5.1/fr/explain-output.html (pour l'explication de 'type' colonne) – rabudde

Répondre

4

La jointure est nettement meilleure que vous pouvez voir dans votre plan d'exécution. : P

La sous-sélection utilise un index pour obtenir la table initiale (count (*), dept_id), puis utilise une table tampon pour se joindre à l'instruction select externe pour obtenir votre résultat. La jointure interne utilise l'index sur le département et l'employé pour déterminer les lignes correspondantes, ce qui vous évite de créer la table tampon et la recherche d'index initiale.

+0

Je ne comprends pas ce plan d'exécution, pouvez-vous l'expliquer en détail? –

+0

@ViswanathanIyer voir ma mise à jour. – Icarus

Questions connexes