programing

CTE와 SubQuery의 차이점

codeshow 2023. 4. 7. 21:47
반응형

CTE와 SubQuery의 차이점

이 투고부터 다음 절차에서 ROW_NUMBER를 사용하는 방법

두 요.sub-query는 '먹다'를 요.CTE같은 문제를 해결할 수 있습니다.

그럼 이제 그, 이, 이, 이, 이, 이, 이, 을, 을, 을, 을, 은?CTE (Common Table Expression)sub-timeout(서브-timeout)을 통해(쿼리가 실제로 수행하는 작업을 보다 쉽게 읽을 수 있음)

「 」를 하는 유일한 CTE에 걸쳐서sub-select내가 실제로 이름을 지을 수 있다는 것이다.sub-queryCTE를 단순한 (재귀적이지 않은) CTE로 사용할 경우 이들 두 가지 사이에 다른 점이 있습니까?

서브쿼리와 단순(재귀적이지 않은) CTE 버전에서는 거의 비슷합니다.프로파일러와 실제 실행 계획을 사용하여 차이점을 발견해야 합니다.그것은 설정에 따라 다릅니다(따라서 전체 답변을 드릴 수 없습니다).

일반적으로 CTE는 재귀적으로 사용할 수 있지만 서브쿼리는 사용할 수 없습니다.이 때문에 특히 나무 구조에 적합합니다.

Common Table Expression(재귀 쿼리에 사용하지 않는 경우)의 주요 장점은 캡슐화입니다.사용하는 모든 장소에서 서브 쿼리를 선언할 필요가 없습니다.서브 쿼리를 1회 정의할 수 있지만 여러 참조가 있습니다.

단, 이것이 1회만 실행되는 것은 아닙니다(이 답변의 반복에 따라 의견을 주신 모든 분들께 감사드립니다).쿼리는 여러 번 참조될 경우 여러 번 실행될 가능성이 있습니다.쿼리 옵티마이저는 최종적으로 CTE의 해석 방법을 결정합니다.

CTE에 가장 재귀는 다음과 같습니다.

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

@n)101, 등에 캘린더, 더미 행셋 등에 도움이 됩니다.

내 생각에 그것들은 더 읽기 쉽다.

별도로, 것것 apart apart apart apartCTE »subqueries일합니니다다

언급되지 않은 한 가지 차이점은 단일 CTE가 조합의 여러 부분에서 참조될 수 있다는 것입니다.

아직 언급되지 않은 중요한 사실 중 하나는 (적어도 포스트그레스에서는) CTE는 최적화 울타리라는 것입니다.

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

즉, 그것들은 전체 쿼리 계획으로 접히는 것이 아니라 그들 자신의 원자 쿼리로 취급된다.자세한 설명을 하기 위한 전문지식은 부족하지만 사용 중인 SQL 버전의 의미론을 확인해야 합니다.고급 사용자의 경우 쿼리 플래너를 제어하는 데 전문가 수준이라면 최적화 펜스를 만들 수 있습니다.단, 99%의 경우,쿼리 플래너에게 무엇을 해야 하는지 지시하는 것은 피해야 합니다.왜냐하면 당신이 생각하는 것보다 빠를 가능성이 높기 때문입니다. :-)

제가 모르는 게 없다면 CTE와 서브쿼리 이름을 쉽게 지정하세요.

주된 차이는 가독성이라고 생각합니다(CTE는 서브쿼리를 중간이 아닌 앞면이 정의되어 있기 때문에 읽기 쉽다고 생각합니다).

또한 재귀에 대해 어떤 조치를 취해야 할 경우 서브쿼리에서는 약간의 문제가 발생합니다.

다른 사용자의 답변에 추가하여 동일한 서브쿼리를 여러 번 사용하는 경우 이러한 서브쿼리를 모두 하나의 CTE로 대체할 수 있습니다.이를 통해 코드를 더 잘 재사용할 수 있습니다.

또한 이전 버전의 SQL Server(예: 많은 사용자가 SQL Server 2000 데이터베이스를 지원해야 함)에서는 CTE가 허용되지 않으며 파생된 테이블이 최적의 솔루션이라는 점도 이해해야 합니다.

힌트: (최대 재귀 n)

특정 스테이트먼트에 허용되는 재귀 수준의 수를 제한할 수 있습니다.MAXRECURSION0 ~ 32,767을 지정합니다.OPTION조문

예를 들어 다음과 같이 시도할 수 있습니다.

OPTION 
      (MAXRECURSION 150)

GO
  1. CTE를 사용하면 재귀를 사용할 수 있습니다.

  2. CTE에서는 한 번만 쓰면 되지만 쿼리 내의 여러 곳에서 참조할 수 있습니다.따라서 반복을 피할 수 있으며 쿼리가 한 번만 참조하는 경우에도 쿼리를 읽고 해석하기 쉽게 만들 수 있습니다.

  3. CTE는 자신에 대한 메타데이터를 쿼리 옵티마이저에 제공하는 것으로 보입니다.이를 통해 CTE가 같은 쿼리에서 여러 번 참조되는 경우(예를 들어 CTE가 자신에게 결합하는 경우), 쿼리 옵티마이저는 잠재적으로 해당 메타데이터를 사용하여 쿼리 실행 계획 전체를 개선할 수 있습니다(이것은 서브쿼리에서는 발생하지 않는 것으로 보입니다).

요약하면 재귀 또는 코드를 보다 알기 쉽고 알기 쉽다고 생각되는 경우 또는 같은 서브쿼리를 여러 번 사용하는 경우 CTE를 사용합니다.

언급URL : https://stackoverflow.com/questions/706972/difference-between-cte-and-subquery

반응형