Sub-frågor

Förbättra frågeprestanda i SQL Server

Dean Smith

Founder, Atamai Analytics

Hur ser sub-frågor ut?

Sub-fråga

Förbättra frågeprestanda i SQL Server

Hur ser sub-frågor ut?

Sub-fråga med yttre fråga

Förbättra frågeprestanda i SQL Server

Sub-fråga med FROM

Sub-fråga med FROM

Förbättra frågeprestanda i SQL Server

Sub-fråga med 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
Förbättra frågeprestanda i SQL Server

Sub-fråga med WHERE

Sub-fråga med WHERE

Förbättra frågeprestanda i SQL Server

Sub-fråga med 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
Förbättra frågeprestanda i SQL Server

Sub-fråga med SELECT

Sub-fråga med SELECT

Förbättra frågeprestanda i SQL Server

Sub-fråga med 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
... ... ...
Förbättra frågeprestanda i SQL Server

Typer av sub-frågor

Okorrelerad sub-fråga

SELECT CustomerID
       ,CompanyName 
FROM Customers
WHERE CustomerID IN

(SELECT CustomerID FROM Orders WHERE Freight > 800);
  • Sub-frågan innehåller ingen referens till den yttre frågan
  • Sub-frågan kan köras oberoende av den yttre frågan
  • Används med WHERE och FROM

Korrelerad sub-fråga

SELECT CustomerID, 
       CompanyName,

(SELECT AVG(Freight) FROM Orders o WHERE c.CustomerID = o.CustomerID) AS AvgFreight
FROM Customers c;
  • Sub-frågan innehåller en referens till den yttre frågan
  • Sub-frågan kan inte köras oberoende av den yttre frågan
  • Används med WHERE och SELECT
Förbättra frågeprestanda i SQL Server

Sub-frågors prestanda

Korrelerad

  • Sub-frågan körs för varje rad i den yttre frågan

Okorrelerad

  • Sub-frågan körs en gång och returnerar resultatet till den yttre frågan
Förbättra frågeprestanda i SQL Server

Sub-fråga vs. INNER JOIN

Korrelerad sub-fråga

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;
Förbättra frågeprestanda i SQL Server

Nu kör vi en övning!

Förbättra frågeprestanda i SQL Server

Preparing Video For Download...