Poddotazy

Improving Query Performance in SQL Server

Dean Smith

Founder, Atamai Analytics

Jak vypadají poddotazy?

Poddotaz

Improving Query Performance in SQL Server

Jak vypadají poddotazy?

Poddotaz s vnějším dotazem

Improving Query Performance in SQL Server

Poddotaz s FROM

Poddotaz s FROM

Improving Query Performance in SQL Server

Poddotaz s 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
Improving Query Performance in SQL Server

Poddotaz s WHERE

Poddotaz s WHERE

Improving Query Performance in SQL Server

Poddotaz s 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
Improving Query Performance in SQL Server

Poddotaz s SELECT

Poddotaz s SELECT

Improving Query Performance in SQL Server

Poddotaz s 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
... ... ...
Improving Query Performance in SQL Server

Typy poddotazů

Nekorelovaný poddotaz

SELECT CustomerID
       ,CompanyName 
FROM Customers
WHERE CustomerID IN

(SELECT CustomerID FROM Orders WHERE Freight > 800);
  • Poddotaz neobsahuje odkaz na vnější dotaz
  • Poddotaz může běžet nezávisle na vnějším dotazu
  • Používá se s WHERE a FROM

Korelovaný poddotaz

SELECT CustomerID, 
       CompanyName,

(SELECT AVG(Freight) FROM Orders o WHERE c.CustomerID = o.CustomerID) AS AvgFreight
FROM Customers c;
  • Poddotaz obsahuje odkaz na vnější dotaz
  • Poddotaz nemůže běžet nezávisle na vnějším dotazu
  • Používá se s WHERE a SELECT
Improving Query Performance in SQL Server

Výkon poddotazů

Korelovaný

  • Poddotaz se spustí pro každý řádek vnějšího dotazu

Nekorelovaný

  • Poddotaz se spustí pouze jednou a vrátí výsledky vnějšímu dotazu
Improving Query Performance in SQL Server

Poddotaz vs. INNER JOIN

Korelovaný poddotaz

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;
Improving Query Performance in SQL Server

Lass uns üben!

Improving Query Performance in SQL Server

Preparing Video For Download...