WITH 절과 서브쿼리의 차이점
와의 차이는 무엇입니까?WITH
조항과 서브쿼리?
1. WITH table_name as ( ... )
2. select *
from ( select curr from tableone t1
left join tabletwo t2
on (t1.empid = t2.empid)
) as temp_table
그WITH
clause는 서브쿼리 팩터링을 위한 것으로 공통 테이블식(CTE)이라고도 합니다.
WITH query_name 절을 사용하면 서브쿼리 블록에 이름을 할당할 수 있습니다.그런 다음 query_name을 지정하여 쿼리의 여러 위치를 하위 쿼리 블록으로 참조할 수 있습니다.Oracle Database는 쿼리 이름을 인라인 보기 또는 임시 테이블로 처리하여 쿼리를 최적화합니다.
두 번째 예에서는 호출한 것이temp_table
는 인라인 뷰이며 임시 테이블이 아닙니다.
대부분의 경우 어떤 것을 사용할지는 사용자가 선호하는 스타일에 따라 결정되며, 특히 여러 수준의 서브쿼리를 사용하여 CTE가 코드를 보다 읽기 쉽게 만들 수 있습니다(물론 의견은 다양합니다).일단 CTE/인라인 뷰만 참조하면 성능 차이는 거의 없고 옵티마이저도 같은 플랜으로 끝날 수 있습니다.
단, 조합 등 여러 장소에서 동일한 서브쿼리를 사용해야 할 경우 특히 유용합니다.코드가 반복되지 않도록 인라인 뷰를 CTE로 끌어낼 수 있으며, 이를 통해 옵티마이저는 그것이 유익하다고 생각될 경우 이를 실현할 수 있습니다.
예를 들어, 다음의 조작 예를 나타냅니다.
select curr from (
select curr from tableone t1
left join tabletwo t2 on (t1.empid = t2.empid)
) temp_table
where curr >= 0
union all
select -1 * curr from (
select curr from tableone t1
left join tabletwo t2 on (t1.empid = t2.empid)
) temp_table
where curr < 0
리팩터링 대상:
with temp_table as (
select curr from tableone t1
left join tabletwo t2 on (t1.empid = t2.empid)
)
select curr from temp_table
where curr >= 0
union all
select -1 * curr from temp_table
where curr < 0
서브쿼리는 더 이상 반복할 필요가 없습니다.코드가 복잡할수록 유지보수의 관점에서 CTE를 사용하는 것이 유리합니다.또한 서브쿼리가 비쌀수록 CTE를 사용함으로써 얻을 수 있는 퍼포먼스가 높아집니다.단, 일반적으로 옵티마이저는 사용자가 무엇을 하고 있는지 파악하는 데 매우 능숙합니다.
또한 하위 쿼리에 분석 함수(LED/LAG 등)가 포함되어 있고 분석 함수의 결과를 필터링하려는 경우 - 를 사용하여SUBQUERY
접근법, 결과를 임시 테이블에 삽입하고 임시 테이블에서 필터링 등을 수행해야 합니다. 반면,WITH
clause 같은 쿼리에서 필터링/필터링/등에 결과를 사용할 수 있습니다.
;WITH temp AS
(
SELECT
ID
, StatusID
, DateChanged
, LEAD(StatusID,1) OVER (PARTITION BY ID ORDER BY ID, DateChanged, StatusID) NextStatusID
FROM
myTable
WHERE
ID in (57,58)
)
SELECT
ID
, StatusID
, DateChanged
FROM
temp
WHERE
temp.NextStatusID IS NULL
아마 없을 거예요.Oracle은 쿼리를 실제로 최적화하기 전에 많은 대수 변환을 수행할 수 있습니다.대부분의 경우 두 쿼리는 동일한 방식으로 평가됩니다(두 쿼리의 실행 계획은 동일합니다).
언급URL : https://stackoverflow.com/questions/30078464/difference-between-with-clause-and-subquery
'programing' 카테고리의 다른 글
WordPress Media Library 머리글 이미지 자르기처럼 삽입 시 이미지 자르기 (0) | 2023.03.29 |
---|---|
스프링 테스트 방법 @Scheduled (0) | 2023.03.29 |
적발되지 않은 불변 위반:이전 렌더링 때보다 더 많은 후크가 렌더링되었습니다. (0) | 2023.03.29 |
com.sun.jdi 입니다.호출메서드를 호출하는 동안 예외가 발생했습니다. (0) | 2023.03.29 |
플럭스 앱에서 어디에 아약스 요청을 해야 합니까? (0) | 2023.03.29 |