서브쿼리

SQL Server에서 쿼리 성능 향상하기

Dean Smith

Founder, Atamai Analytics

서브쿼리는 어떻게 생겼나?

서브쿼리

SQL Server에서 쿼리 성능 향상하기

서브쿼리는 어떻게 생겼나?

외부 쿼리와 서브쿼리

SQL Server에서 쿼리 성능 향상하기

FROM과 함께 쓰는 서브쿼리

FROM과 함께 쓰는 서브쿼리

SQL Server에서 쿼리 성능 향상하기

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
SQL Server에서 쿼리 성능 향상하기

WHERE와 함께 쓰는 서브쿼리

WHERE와 함께 쓰는 서브쿼리

SQL Server에서 쿼리 성능 향상하기

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
SQL Server에서 쿼리 성능 향상하기

SELECT와 함께 쓰는 서브쿼리

SELECT와 함께 쓰는 서브쿼리

SQL Server에서 쿼리 성능 향상하기

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
... ... ...
SQL Server에서 쿼리 성능 향상하기

서브쿼리 유형

비상관 서브쿼리

SELECT CustomerID
       ,CompanyName 
FROM Customers
WHERE CustomerID IN

(SELECT CustomerID FROM Orders WHERE Freight > 800);
  • 서브쿼리에 외부 쿼리 참조가 없음
  • 외부 쿼리 없이도 독립 실행 가능
  • WHERE, FROM에서 사용

상관 서브쿼리

SELECT CustomerID, 
       CompanyName,

(SELECT AVG(Freight) FROM Orders o WHERE c.CustomerID = o.CustomerID) AS AvgFreight
FROM Customers c;
  • 서브쿼리에 외부 쿼리 참조가 있음
  • 외부 쿼리 없이는 실행 불가
  • WHERE, SELECT에서 사용
SQL Server에서 쿼리 성능 향상하기

서브쿼리 성능

상관형

  • 외부 쿼리의 각 행마다 실행됨

비상관형

  • 한 번만 실행되어 외부 쿼리에 결과 전달
SQL Server에서 쿼리 성능 향상하기

서브쿼리 vs. INNER JOIN

상관 서브쿼리

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;
SQL Server에서 쿼리 성능 향상하기

Vamos praticar!

SQL Server에서 쿼리 성능 향상하기

Preparing Video For Download...