Sub-interogări

Îmbunătățirea performanței interogărilor în SQL Server

Dean Smith

Founder, Atamai Analytics

Cum arată sub-interogările?

Sub-interogare

Îmbunătățirea performanței interogărilor în SQL Server

Cum arată sub-interogările?

Sub-interogare cu interogare externă

Îmbunătățirea performanței interogărilor în SQL Server

Sub-interogare cu FROM

Sub-interogare cu FROM

Îmbunătățirea performanței interogărilor în SQL Server

Sub-interogare cu 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
Îmbunătățirea performanței interogărilor în SQL Server

Sub-interogare cu WHERE

Sub-interogare cu WHERE

Îmbunătățirea performanței interogărilor în SQL Server

Sub-interogare cu 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
Îmbunătățirea performanței interogărilor în SQL Server

Sub-interogare cu SELECT

Sub-interogare cu SELECT

Îmbunătățirea performanței interogărilor în SQL Server

Sub-interogare cu 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
... ... ...
Îmbunătățirea performanței interogărilor în SQL Server

Tipuri de sub-interogări

Sub-interogare necorelată

SELECT CustomerID
       ,CompanyName 
FROM Customers
WHERE CustomerID IN

(SELECT CustomerID FROM Orders WHERE Freight > 800);
  • Sub-interogarea _nu_ conține o referință la interogarea externă
  • Sub-interogarea poate rula independent de interogarea externă
  • Utilizată cu WHERE și FROM

Sub-interogare corelată

SELECT CustomerID, 
       CompanyName,

(SELECT AVG(Freight) FROM Orders o WHERE c.CustomerID = o.CustomerID) AS AvgFreight
FROM Customers c;
  • Sub-interogarea conține o referință la interogarea externă
  • Sub-interogarea nu poate rula independent de interogarea externă
  • Utilizată cu WHERE și SELECT
Îmbunătățirea performanței interogărilor în SQL Server

Performanța sub-interogărilor

Corelată

  • Sub-interogarea se execută pentru fiecare rând din interogarea externă

Necorelată

  • Sub-interogarea se execută o singură dată și returnează rezultatele interogării externe
Îmbunătățirea performanței interogărilor în SQL Server

Sub-interogare vs. INNER JOIN

Sub-interogare corelată

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;
Îmbunătățirea performanței interogărilor în SQL Server

Să exersăm!

Îmbunătățirea performanței interogărilor în SQL Server

Preparing Video For Download...