더북(TheBook)

이런 뷰에는 몇 가지 잠재적인 문제점이 있는데, DBMS에 따라 그 양상이 다르다. 하지만 일반적으로 옵티마이저는 뷰를 보는 순간 일단 그 뷰를 분해한다. 분해한 뷰에 또 다른 뷰가 있다면 이런 뷰도 분해한다. 이상적인 관점에서 보면 옵티마이저는 이 뷰 세 개를 코드 3-4와 같이 효율적인 인라인 형태의 문장으로 결합한다.

코드 3-4 뷰를 결합한 문장

SELECT c.CustomerID, c.CustFirstName, c.CustLastName,

  s.LastOrderDate, s.GrandOrderTotal

FROM Customers AS c

  INNER JOIN

    (SELECT o.CustomerID,

        SUM(o.OrderTotal) AS GrandOrderTotal,

        MAX(o.OrderDate) AS LastOrderDate

     FROM Orders AS o

     GROUP BY o.CustomerID) AS s

    ON c.CustomerID = s.CustomerID

WHERE EXISTS

  (SELECT NULL

   FROM Orders AS o

   WHERE o.CustomerID = c.CustomerID

     AND o.OrderDate > DATEADD(MONTH, -6, GETDATE()));


 

코드 3-4에서는 실제로 사용되지 않는 특정 컬럼이나 표현식을 제거했다. 특히 주 쿼리와 서브쿼리 어디에도 없는 OrderCountCustFullName은 없애 버렸다. 하지만 실제로는 중간 결과를 산출하는 또 다른 중간 결과의 집합을 조인하는 모든 표현식 계산을 포함해서 이 뷰에 있는 내용들을 옵티마이저가 미리 처리할 것이다. 힘들여 모든 계산을 수행했음에도 최종 뷰에서 사용하지 않아 일부 표현식을 버린 것이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.