복붙노트

[SQL] CTE와 하위 쿼리의 차이?

SQL

CTE와 하위 쿼리의 차이?

이 게시물에서 어떻게 다음 절차에 ROW_NUMBER를 사용 하는가?

하나는 같은 문제를 해결하기 위해 하위 쿼리와 다른 사용하는 CTE를 사용하여 응답의 두 가지 버전이 있습니다.

이제 다음, 하위 쿼리를 통해 CTE (공통 테이블 식)를 사용의 장점은 무엇인가 (쿼리가 실제로 무엇을하고 있는지, 따라서 더 읽기)

하위 선택을 통해 CTE를 사용하는 유일한 장점은 내가 실제로 서브 쿼리의 이름을 수 있다는 것입니다. CTE를이 (비 재귀) CTE 간단한로 사용하는 경우 그 둘 사이에 다른 어떤 차이가 있습니까?

해결법

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

    1.간단한 (비 재귀) CTE 버전 대, 서브 쿼리, 그들은 아마 매우 유사합니다. 당신은 어떤 차이를 발견하기 위해 프로파일 및 실제 실행 계획을 사용하는 것, 그리고 (우리는 당신에게 전체에서 답을 말할 수) 그것은 당신의 설치에 고유 한 것이다.

    간단한 (비 재귀) CTE 버전 대, 서브 쿼리, 그들은 아마 매우 유사합니다. 당신은 어떤 차이를 발견하기 위해 프로파일 및 실제 실행 계획을 사용하는 것, 그리고 (우리는 당신에게 전체에서 답을 말할 수) 그것은 당신의 설치에 고유 한 것이다.

    일반적으로; CTE를 재귀 적으로 사용될 수있다; 하위 쿼리 할 수 ​​없습니다. 이것은 그들이 특히 잘 트리 구조에 적합합니다.

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

    2.공통 테이블 표현식의 가장 큰 장점은 (재귀 쿼리를 사용하지 않을 경우) 대신 당신이 그것을 사용하고자하는 모든 장소에서 하위 쿼리를 선언 할 필요없이, 캡슐화, 당신은 한 번 정의 할 수 있지만 여러 참조가 그것.

    공통 테이블 표현식의 가장 큰 장점은 (재귀 쿼리를 사용하지 않을 경우) 대신 당신이 그것을 사용하고자하는 모든 장소에서 하위 쿼리를 선언 할 필요없이, 캡슐화, 당신은 한 번 정의 할 수 있지만 여러 참조가 그것.

    그러나이가 한 번만 실행되는 것을 의미하지 않는다 (이 매우 응답의 이전 반복에 따라, 댓글을 달았 모든 사람들에게 감사). 쿼리는 확실히 여러 번 참조하면 여러 번 실행될 수있는 잠재력을 가지고; 쿼리 최적화 프로그램은 궁극적으로 CTE 해석되어야하는지에 관한 결정을한다.

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

    3.CTE의의 재귀에 가장 유용합니다 :

    CTE의의 재귀에 가장 유용합니다 :

    WITH hier(cnt) AS (
            SELECT  1
            UNION ALL
            SELECT  cnt + 1
            FROM    hier
            WHERE   cnt < @n
            )
    SELECT  cnt
    FROM    hier
    

    (101까지) 행을 @n 반환합니다. 달력에 유용, 더미 행 집합 등

    그들은 또한 (내 생각에) 더 읽을 수 있습니다.

    이 외에도에서, CTE의 서브 쿼리는 동일합니다.

  4. ==============================

    4.언급되지 않은 한 가지 차이점은 하나의 CTE는 노동 조합의 여러 부분에서 참조 할 수있다

    언급되지 않은 한 가지 차이점은 하나의 CTE는 노동 조합의 여러 부분에서 참조 할 수있다

  5. ==============================

    5.내가 뭔가를 누락하지 않는 한, 당신은 쉽게 CTE의 서브 쿼리 이름을 지정할 수 있습니다.

    내가 뭔가를 누락하지 않는 한, 당신은 쉽게 CTE의 서브 쿼리 이름을 지정할 수 있습니다.

    나는 주요 차이점은 가독성 것 같다 (이 중간에보다 앞 오히려 하위 쿼리를 정의하기 때문에 나는 CTE가 더 읽기 찾기).

    당신은 재귀 아무것도 할 필요가 있다면, 당신은 문제가 하위 쿼리와 함께 그 일을 조금해야 할 것)

  6. ==============================

    6.아무도 언급되지 것을 한 가지 중요한 사실은 (포스트 그레스에서 적어도), CTE를 최적화 울타리 있다는 것입니다 :

    아무도 언급되지 것을 한 가지 중요한 사실은 (포스트 그레스에서 적어도), CTE를 최적화 울타리 있다는 것입니다 :

    https://blog.2ndquadrant.com/postgresql-ctes-are-optimization-fences/

    즉 그들은 자신의 원자 쿼리로 처리하기보다는 전체 쿼리 계획에 접혀있을 것입니다. 나는 더 나은 설명을 제공 할 수있는 전문 지식 부족,하지만 당신은 당신이 사용하는 SQL의 버전에 대한 의미를 확인해야합니다; 고급 사용자를위한 최적화 울타리 캔 도움의 성능을 만들 수있는 것은 당신은 쿼리 계획을 제어하는 ​​전문가 수준의 경우; 사례의 99 %에서, 그러나, 당신은 당신이 더 빨리 될 것입니다 생각보다 가능성이 더 나쁘다 빨라집니다 생각하기 때문에, 무엇을해야 하는지를 쿼리 계획을 말하려고하지 않도록해야합니다. :-)

  7. ==============================

    7.하나이 같은 하위 쿼리가 여러 번 사용하는 경우, 당신은 하나의 CTE와 모든 하위 쿼리를 대체 할 수있는, 다른 사람의 답변에 추가. 이것은 당신이 더 나은 코드를 재사용 할 수 있습니다.

    하나이 같은 하위 쿼리가 여러 번 사용하는 경우, 당신은 하나의 CTE와 모든 하위 쿼리를 대체 할 수있는, 다른 사람의 답변에 추가. 이것은 당신이 더 나은 코드를 재사용 할 수 있습니다.

  8. ==============================

    8.당신은 또한 이해할 필요가 있다는 것은 SQL 서버의 이전 버전에서, 열팽창 계수가 허용되지 않습니다 후 파생 테이블이 가장 좋은 솔루션입니다 (예 많은 사람들이 여전히 SQL 서버 2000 데이터베이스 지원해야)한다는 것입니다.

    당신은 또한 이해할 필요가 있다는 것은 SQL 서버의 이전 버전에서, 열팽창 계수가 허용되지 않습니다 후 파생 테이블이 가장 좋은 솔루션입니다 (예 많은 사람들이 여전히 SQL 서버 2000 데이터베이스 지원해야)한다는 것입니다.

  9. ==============================

    9.HINT (MAXRECURSION 않음)

    HINT (MAXRECURSION 않음)

    예를 들어, 당신은 시도 할 수 있습니다 :

    OPTION 
          (MAXRECURSION 150)
    
    GO
    
  10. from https://stackoverflow.com/questions/706972/difference-between-cte-and-subquery by cc-by-sa and MIT license