복붙노트

[SQL] 자신의 SQL Server 2005의 책과 SQL 서버 2008 책에 Itzik 벤 웨이 코 뮤니시의 논리 질의 처리 순서에 대해 혼란

SQL

자신의 SQL Server 2005의 책과 SQL 서버 2008 책에 Itzik 벤 웨이 코 뮤니시의 논리 질의 처리 순서에 대해 혼란

책 내부의 Microsoft SQL Server ™ 2005 T-SQL 쿼리에서, 저자 Itzik 벤 웨이 코 뮤니시는 우리에게 순서를 알 또는 SQL Server 2005의 논리적 인 질의 처리는 다음과 같습니다

(8)  SELECT (9) DISTINCT (11) <TOP_specification> <select_list>
(1)  FROM <left_table>
(3)       <join_type> JOIN <right_table>
(2)       ON <join_condition>
(4)  WHERE <where_condition>
(5)  GROUP BY <group_by_list>
(6)  WITH {CUBE | ROLLUP}
(7)  HAVING <having_condition>
(10) ORDER BY <order_by_list>

1.  FROM
2.  ON
3.  OUTER (join)
4.  WHERE
5.  GROUP BY
6.  CUBE | ROLLUP
7.  HAVING
8.  SELECT
9.  DISTINCT
10. ORDER BY  <---------------------- NOTE
11. TOP       <---------------------- NOTE

그의 책 내부 마이크로 소프트 SQL 서버 2008 : T-SQL 쿼리, 그는 우리에게 다음과 같은 논리적 인 질의 처리 순서를 알 :

(1) FROM
(1-J1) Cartesian Product
(1-J2) ON Filter
(1-J3) Add Outer Rows
(2) WHERE
(3) GROUP BY
(4) HAVING
(5) SELECT
(5-1) Evaluate Expressions
(5-2) DISTINCT
(5-3) TOP       <---------------------- NOTE
(6) ORDER BY    <---------------------- NOTE

이 책에서 위 발췌에서 TOP 및 ORDER BY의 순서를합니다. 그들은 바로 맞은 편입니다. 나는이 두 단계는 매우 중요하다고 생각하고, 다른 순서와 완전히 다른 결과를 줄 것이다. 나는 SQL 서버 2008은 SQL Server 2005 또는이 원인이 뭔가 다른 이유에서의 스토리지 엔진에 뭔가를 변경 여부를 알고 싶어?

감사.

해결법

  1. ==============================

    1.논리적 처리 순서는이 온라인 항목에 설명되어 있습니다. 실제 처리 순서에서 논리적 처리 순서를 구별 할주의하십시오. BOL 항목 노트로 :

    논리적 처리 순서는이 온라인 항목에 설명되어 있습니다. 실제 처리 순서에서 논리적 처리 순서를 구별 할주의하십시오. BOL 항목 노트로 :

    쿼리 최적화 프로그램은 올바른 결과를 물리적 실행 계획으로 쿼리에 의해 지정된 논리적 인 요구 사항을 번역 무료입니다. 일반적으로, 주어진 로직 쿼리 많은 물리적 대안 물리적 계획 (결합 상업적) 논리 처리 순서 근본적으로 다르다 상술하기 때문에 매우 일반적이다있다.

  2. ==============================

    2.이 체크 아웃 - 그것은이 문제에 노출 - 그리고 Itzik의 책이 언급된다. 2 차 위에 올.

    이 체크 아웃 - 그것은이 문제에 노출 - 그리고 Itzik의 책이 언급된다. 2 차 위에 올.

  3. ==============================

    3.T-SQL 쿼리의 자신의 2015 릴리스에서는 Itzik 벤 웨이 코 뮤니시는이 같은 "1-1 논리 쿼리 처리 단계 번호를 목록"에서 처리 논리적 쿼리를 업데이트 :

    T-SQL 쿼리의 자신의 2015 릴리스에서는 Itzik 벤 웨이 코 뮤니시는이 같은 "1-1 논리 쿼리 처리 단계 번호를 목록"에서 처리 논리적 쿼리를 업데이트 :

    (5) SELECT (5-2) DISTINCT (7) TOP(<top_specification>) (5-1) <select_list>
    (1) FROM (1-J) <left_table> <join_type> JOIN <right_table> ON <on_predicate> 
           | (1-A) <left_table> <apply_type> APPLY <right_input_table> AS <alias> 
           | (1-P) <left_table> PIVOT(<pivot_specification>) AS <alias> 
           | (1-U) <left_table> UNPIVOT(<unpivot_specification>) AS <alias> 
    (2) WHERE <where_predicate> 
    (3) GROUP BY <group_by_specification> 
    (4) HAVING <having_predicate> 
    (6) ORDER BY <order_by_list> 
    (7) OFFSET <offset_specification> ROWS FETCH NEXT <fetch_specification> ROWS ONLY;
    

    이 책의 이전 2008 버전과는 달리, ORDER BY (6 단계)는 이제 TOP (7 단계) 이전에 발생합니다. 다른 곳에서 언급 한 바와 같이 물론, 두 사람은 관련이 있습니다. Itzik는 T-SQL 쿼리의 6 페이지의 설명에 :

    이 SQL에서 달리 직관적 단점을 설명하기 때문에 위의 논리적 인 질의 처리 단계를 이해하는 것이 중요합니다.

    표현 엔진이 SELECT 절 전에 WHEREclause을 평가하기 때문에 예를 들어, WHERE 절 (2 단계)에서 SELECT 절 (단계 5-2)에서 별칭을 사용할 수 없습니다.

    -- This won't work!
    SELECT Cost = Quantity * Price
    FROM Orders
    WHERE Cost > 500.00;
    

    로 Itzik "는 그의 책에서의 단계를 말한다 쿼리의 논리적 인 처리는 특정 순서가 있습니다. 대조적으로, 최적화는 종종 바로 가기를 만들 수 있습니다 실제 실행 계획이 생성하는. 물론, 그것은 단지 결과 집합 경우 바로 가기를 만들 것 올바른로 보장됩니다. "

  4. from https://stackoverflow.com/questions/3270338/confused-about-itzik-ben-gans-logical-query-processing-order-in-his-sql-server by cc-by-sa and MIT license