Sous-requêtes

Améliorer les performances des requêtes dans SQL Server

Dean Smith

Founder, Atamai Analytics

À quoi ressemblent les sous-requêtes ?

Sous-requête

Améliorer les performances des requêtes dans SQL Server

À quoi ressemblent les sous-requêtes ?

Sous-requête avec requête externe

Améliorer les performances des requêtes dans SQL Server

Sous-requête avec FROM

Sous-requête avec FROM

Améliorer les performances des requêtes dans SQL Server

Sous-requête avec FROM

SELECT OrderID, 
       CustomerID, 
       NumDays
FROM 
    (SELECT *, 
     DATEDIFF(DAY,OrderDate,ShippedDate) AS NumDays 
     FROM Orders) AS o
WHERE NumDays >= 35;
OrderID CustomerID NumDays
10380 HUNGO 35
10427 PICCO 35
10545 LAZYK 35
10593 LEHMS 35
10660 HUNGC 37
10777 GOURL 37
10924 BERGS 35
Améliorer les performances des requêtes dans SQL Server

Sous-requête avec WHERE

Sous-requête avec WHERE

Améliorer les performances des requêtes dans SQL Server

Sous-requête avec WHERE

SELECT CustomerID
       ,CompanyName 
FROM Customers
WHERE CustomerID 
         IN (SELECT CustomerID 
         FROM Orders 
         WHERE Freight > 800);
CustomerID CompanyName
QUEEN Queen Cozinha
QUICK QUICK-Stop
SAVEA Save-a-lot Markets
Améliorer les performances des requêtes dans SQL Server

Sous-requête avec SELECT

Sous-requête avec SELECT

Améliorer les performances des requêtes dans SQL Server

Sous-requête avec SELECT

SELECT CustomerID, 
       CompanyName, 
        (SELECT AVG(Freight) 
        FROM Orders o 
        WHERE c.CustomerID = o.CustomerID) AS AvgFreight
FROM Customers c;
CustomerID CompanyName AvgFreight
ALFKI Alfreds Futterkiste 37.6
ANATR Ana Trujillo Emparedados y helados 24.4
ANTON Antonio Moreno Taquería 38.4
... ... ...
Améliorer les performances des requêtes dans SQL Server

Types de sous-requêtes

Sous-requête non corrélée

SELECT CustomerID
       ,CompanyName 
FROM Customers
WHERE CustomerID IN

(SELECT CustomerID FROM Orders WHERE Freight > 800);
  • La sous-requête _ne_ contient aucune référence à la requête externe
  • La sous-requête peut s’exécuter indépendamment de la requête externe
  • Utilisée avec WHERE et FROM

Sous-requête corrélée

SELECT CustomerID, 
       CompanyName,

(SELECT AVG(Freight) FROM Orders o WHERE c.CustomerID = o.CustomerID) AS AvgFreight
FROM Customers c;
  • La sous-requête contient une référence à la requête externe
  • La sous-requête ne peut pas s’exécuter indépendamment de la requête externe
  • Utilisée avec WHERE et SELECT
Améliorer les performances des requêtes dans SQL Server

Performances des sous-requêtes

Corrélée

  • La sous-requête s’exécute pour chaque ligne de la requête externe

Non corrélée

  • La sous-requête ne s’exécute qu’une fois et renvoie les résultats à la requête externe
Améliorer les performances des requêtes dans SQL Server

Sous-requête vs INNER JOIN

Sous-requête corrélée

SELECT CustomerID, 
       CompanyName, 
        (SELECT AVG(Freight) 
        FROM Orders o 
        WHERE c.CustomerID = o.CustomerID) AS AvgFreight
FROM Customers c;

INNER JOIN

SELECT c.CustomerID,
       c.CompanyName, 
       AVG(o.Freight)
FROM Customers c
INNER JOIN Orders o
    ON c.CustomerID = o.CustomerID
GROUP BY c.CustomerID,
         c.CompanyName;
Améliorer les performances des requêtes dans SQL Server

Passons à la pratique !

Améliorer les performances des requêtes dans SQL Server

Preparing Video For Download...