programing

WITH 절과 서브쿼리의 차이점

powerit 2023. 3. 29. 21:58
반응형

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

WITHclause는 서브쿼리 팩터링을 위한 것으로 공통 테이블식(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접근법, 결과를 임시 테이블에 삽입하고 임시 테이블에서 필터링 등을 수행해야 합니다. 반면,WITHclause 같은 쿼리에서 필터링/필터링/등에 결과를 사용할 수 있습니다.

;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

반응형