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
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'
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.

Voilà la méthode #1 :
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
Ici, j'utilise un GROUP BY qui d'après mes connaissance semble couteux vu le nombre d'argument qu'il possède.

Maintenant, voyons la méthode #2 :
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
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.

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