[SQL] CTE와 하위 쿼리의 차이?
SQLCTE와 하위 쿼리의 차이?
이 게시물에서 어떻게 다음 절차에 ROW_NUMBER를 사용 하는가?
하나는 같은 문제를 해결하기 위해 하위 쿼리와 다른 사용하는 CTE를 사용하여 응답의 두 가지 버전이 있습니다.
이제 다음, 하위 쿼리를 통해 CTE (공통 테이블 식)를 사용의 장점은 무엇인가 (쿼리가 실제로 무엇을하고 있는지, 따라서 더 읽기)
하위 선택을 통해 CTE를 사용하는 유일한 장점은 내가 실제로 서브 쿼리의 이름을 수 있다는 것입니다. CTE를이 (비 재귀) CTE 간단한로 사용하는 경우 그 둘 사이에 다른 어떤 차이가 있습니까?
해결법
-
==============================
1.간단한 (비 재귀) CTE 버전 대, 서브 쿼리, 그들은 아마 매우 유사합니다. 당신은 어떤 차이를 발견하기 위해 프로파일 및 실제 실행 계획을 사용하는 것, 그리고 (우리는 당신에게 전체에서 답을 말할 수) 그것은 당신의 설치에 고유 한 것이다.
간단한 (비 재귀) CTE 버전 대, 서브 쿼리, 그들은 아마 매우 유사합니다. 당신은 어떤 차이를 발견하기 위해 프로파일 및 실제 실행 계획을 사용하는 것, 그리고 (우리는 당신에게 전체에서 답을 말할 수) 그것은 당신의 설치에 고유 한 것이다.
일반적으로; CTE를 재귀 적으로 사용될 수있다; 하위 쿼리 할 수 없습니다. 이것은 그들이 특히 잘 트리 구조에 적합합니다.
-
==============================
2.공통 테이블 표현식의 가장 큰 장점은 (재귀 쿼리를 사용하지 않을 경우) 대신 당신이 그것을 사용하고자하는 모든 장소에서 하위 쿼리를 선언 할 필요없이, 캡슐화, 당신은 한 번 정의 할 수 있지만 여러 참조가 그것.
공통 테이블 표현식의 가장 큰 장점은 (재귀 쿼리를 사용하지 않을 경우) 대신 당신이 그것을 사용하고자하는 모든 장소에서 하위 쿼리를 선언 할 필요없이, 캡슐화, 당신은 한 번 정의 할 수 있지만 여러 참조가 그것.
그러나이가 한 번만 실행되는 것을 의미하지 않는다 (이 매우 응답의 이전 반복에 따라, 댓글을 달았 모든 사람들에게 감사). 쿼리는 확실히 여러 번 참조하면 여러 번 실행될 수있는 잠재력을 가지고; 쿼리 최적화 프로그램은 궁극적으로 CTE 해석되어야하는지에 관한 결정을한다.
-
==============================
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.언급되지 않은 한 가지 차이점은 하나의 CTE는 노동 조합의 여러 부분에서 참조 할 수있다
언급되지 않은 한 가지 차이점은 하나의 CTE는 노동 조합의 여러 부분에서 참조 할 수있다
-
==============================
5.내가 뭔가를 누락하지 않는 한, 당신은 쉽게 CTE의 서브 쿼리 이름을 지정할 수 있습니다.
내가 뭔가를 누락하지 않는 한, 당신은 쉽게 CTE의 서브 쿼리 이름을 지정할 수 있습니다.
나는 주요 차이점은 가독성 것 같다 (이 중간에보다 앞 오히려 하위 쿼리를 정의하기 때문에 나는 CTE가 더 읽기 찾기).
당신은 재귀 아무것도 할 필요가 있다면, 당신은 문제가 하위 쿼리와 함께 그 일을 조금해야 할 것)
-
==============================
6.아무도 언급되지 것을 한 가지 중요한 사실은 (포스트 그레스에서 적어도), CTE를 최적화 울타리 있다는 것입니다 :
아무도 언급되지 것을 한 가지 중요한 사실은 (포스트 그레스에서 적어도), CTE를 최적화 울타리 있다는 것입니다 :
https://blog.2ndquadrant.com/postgresql-ctes-are-optimization-fences/
즉 그들은 자신의 원자 쿼리로 처리하기보다는 전체 쿼리 계획에 접혀있을 것입니다. 나는 더 나은 설명을 제공 할 수있는 전문 지식 부족,하지만 당신은 당신이 사용하는 SQL의 버전에 대한 의미를 확인해야합니다; 고급 사용자를위한 최적화 울타리 캔 도움의 성능을 만들 수있는 것은 당신은 쿼리 계획을 제어하는 전문가 수준의 경우; 사례의 99 %에서, 그러나, 당신은 당신이 더 빨리 될 것입니다 생각보다 가능성이 더 나쁘다 빨라집니다 생각하기 때문에, 무엇을해야 하는지를 쿼리 계획을 말하려고하지 않도록해야합니다. :-)
-
==============================
7.하나이 같은 하위 쿼리가 여러 번 사용하는 경우, 당신은 하나의 CTE와 모든 하위 쿼리를 대체 할 수있는, 다른 사람의 답변에 추가. 이것은 당신이 더 나은 코드를 재사용 할 수 있습니다.
하나이 같은 하위 쿼리가 여러 번 사용하는 경우, 당신은 하나의 CTE와 모든 하위 쿼리를 대체 할 수있는, 다른 사람의 답변에 추가. 이것은 당신이 더 나은 코드를 재사용 할 수 있습니다.
-
==============================
8.당신은 또한 이해할 필요가 있다는 것은 SQL 서버의 이전 버전에서, 열팽창 계수가 허용되지 않습니다 후 파생 테이블이 가장 좋은 솔루션입니다 (예 많은 사람들이 여전히 SQL 서버 2000 데이터베이스 지원해야)한다는 것입니다.
당신은 또한 이해할 필요가 있다는 것은 SQL 서버의 이전 버전에서, 열팽창 계수가 허용되지 않습니다 후 파생 테이블이 가장 좋은 솔루션입니다 (예 많은 사람들이 여전히 SQL 서버 2000 데이터베이스 지원해야)한다는 것입니다.
-
==============================
9.HINT (MAXRECURSION 않음)
HINT (MAXRECURSION 않음)
예를 들어, 당신은 시도 할 수 있습니다 :
OPTION (MAXRECURSION 150) GO
from https://stackoverflow.com/questions/706972/difference-between-cte-and-subquery by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 물리 대 논리 / 소프트 데이터베이스 레코드의 삭제 하시겠습니까? (0) | 2020.03.31 |
---|---|
[SQL] 날짜 시간과 같거나 MySQL은 오늘보다 더 큰 (0) | 2020.03.31 |
[SQL] 왼쪽 Where 절과 함께 가입 (0) | 2020.03.31 |
[SQL] MySQL 데이터베이스에서 통화 값을 저장하기위한 최고의 데이터 유형 (0) | 2020.03.31 |
[SQL] 으로 SQL Server 테이블 열에서 문자열을 대체하는 방법 (0) | 2020.03.31 |