CTE와 SubQuery의 차이점
이 투고부터 다음 절차에서 ROW_NUMBER를 사용하는 방법
두 요.sub-query
는 '먹다'를 요.CTE
같은 문제를 해결할 수 있습니다.
그럼 이제 그, 이, 이, 이, 이, 이, 이, 을, 을, 을, 을, 은?CTE (Common Table Expression)
sub-timeout(서브-timeout)을 통해(쿼리가 실제로 수행하는 작업을 보다 쉽게 읽을 수 있음)
「 」를 하는 유일한 CTE
에 걸쳐서sub-select
내가 실제로 이름을 지을 수 있다는 것이다.sub-query
CTE를 단순한 (재귀적이지 않은) 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)
특정 스테이트먼트에 허용되는 재귀 수준의 수를 제한할 수 있습니다.
MAXRECURSION
0 ~ 32,767의 값을 지정합니다.OPTION
조문
예를 들어 다음과 같이 시도할 수 있습니다.
OPTION
(MAXRECURSION 150)
GO
CTE를 사용하면 재귀를 사용할 수 있습니다.
CTE에서는 한 번만 쓰면 되지만 쿼리 내의 여러 곳에서 참조할 수 있습니다.따라서 반복을 피할 수 있으며 쿼리가 한 번만 참조하는 경우에도 쿼리를 읽고 해석하기 쉽게 만들 수 있습니다.
CTE는 자신에 대한 메타데이터를 쿼리 옵티마이저에 제공하는 것으로 보입니다.이를 통해 CTE가 같은 쿼리에서 여러 번 참조되는 경우(예를 들어 CTE가 자신에게 결합하는 경우), 쿼리 옵티마이저는 잠재적으로 해당 메타데이터를 사용하여 쿼리 실행 계획 전체를 개선할 수 있습니다(이것은 서브쿼리에서는 발생하지 않는 것으로 보입니다).
요약하면 재귀 또는 코드를 보다 알기 쉽고 알기 쉽다고 생각되는 경우 또는 같은 서브쿼리를 여러 번 사용하는 경우 CTE를 사용합니다.
언급URL : https://stackoverflow.com/questions/706972/difference-between-cte-and-subquery
'programing' 카테고리의 다른 글
SQL Server에서의 INSERT 또는 업데이트 솔루션 (0) | 2023.04.07 |
---|---|
.bak 파일을 SQL 서버의 데이터베이스로 가져옵니다. (0) | 2023.04.07 |
SQL Server에서 JOIN을 사용하여 테이블을 업데이트하시겠습니까? (0) | 2023.04.07 |
SQL Server 레코드 세트를 루프하려면 어떻게 해야 합니까? (0) | 2023.04.07 |
Visual Studio:콘텍스트 스위치 데드록 (0) | 2023.04.07 |