Bonjour à tous,
J'ai une question que je me pose souvent. J'aimerais déterminer de façon général, laquelle des deux requêtes suivante est la plus performante et la bonne façon de faire.
Toute d'abord, prenons la table suivante
Cette table contient des employés. Chaque employé est susceptible d'être le patron d'un autre. Enfin bref, imagons maintenant que je désire récupérer la liste de tous les employés ainsi que le nombre de subordinné (immédiat) étant associé à chacun d'eux.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 DECLARE @TbEmployee TABLE(EmployeeID INT, EmpSubordinateID INT, EmpFirstName VARCHAR(40), EmpLastName VARCHAR(40), EmpPhoneNumber VARCHAR(40) ) INSERT INTO @TbEmployee SELECT 1, NULL, 'e1', 'e1', '888-888-8888' UNION ALL SELECT 2, NULL, 'e2', 'e2', '888-888-8888' UNION ALL SELECT 3, 1, 'e3', 'e3', '888-888-8888' UNION ALL SELECT 4, 3, 'e4', 'e4', '888-888-8888' UNION ALL SELECT 5, 4, 'e5', 'e5', '888-888-8888' UNION ALL SELECT 6, 5, 'e6', 'e6', '888-888-8888'
Voilà la méthode #1 :
Ici, j'utilise un GROUP BY qui d'après mes connaissance semble couteux vu le nombre d'argument qu'il possède.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 SELECT TbEmployee.EmployeeID, TbEmployee.EmpSubordinateID, TbEmployee.EmpFirstName, TbEmployee.EmpLastName, TbEmployee.EmpPhoneNumber, COUNT(TbSubordinate.EmployeeID) FROM @TbEmployee AS TbEmployee LEFT JOIN @TbEmployee AS TbSubordinate ON TbEmployee.EmployeeID = TbSubordinate.EmpSubordinateID GROUP BY TbEmployee.EmployeeID, TbEmployee.EmpSubordinateID, TbEmployee.EmpFirstName, TbEmployee.EmpLastName, TbEmployee.EmpPhoneNumber
Maintenant, voyons la méthode #2 :
Cette dernière méthode commence par regrouper les données en fonction du ID de l'employé ensuite, elle joint le tout à la table Employee afin de récupérer les information supplémentaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 SELECT TableEmp.EmpFirstName, TableEmp.EmpLastName, TableEmp.EmpPhoneNumber, TableTotal.NombreDeSub FROM ( SELECT TbEmployee.EmployeeID, TbEmployee.EmpSubordinateID, COUNT(TbSubordinate.EmployeeID) AS NombreDeSub FROM @TbEmployee AS TbEmployee LEFT JOIN @TbEmployee AS TbSubordinate ON TbEmployee.EmployeeID = TbSubordinate.EmpSubordinateID GROUP BY TbEmployee.EmployeeID, TbEmployee.EmpSubordinateID ) AS TableTotal INNER JOIN @TbEmployee AS TableEmp ON TableEmp.EmployeeID = TableTotal.EmployeeID
Donc, selon-vous laquelle de ces deux méthodes est la plus performante ? Aussi, laquelle est la bonne façon de faire selon ce context.
Merci pour vos commentaires![]()
Partager