with 절 union all 하는 경우, 올바른 재활용 방법이 어떻게 되나요? 0 1 1,654

by 레브레카 [2014.12.17 17:03:39]


개수 파악 용도의 쿼리가 몇 개 있습니다.

with 절을 이용한 뷰 테이블은 모든 쿼리에서 동일하고요.

구조가 간단하게 다음과 같은데, 보시는 분들이 이해가 되실지 모르겠네요....

 

with A as (

  특정 테이블에 조건이 있는 SQL

)

, B as (

  동일 (조건만 다름)

)

/* from절 내에 생성된 임시 뷰 테이블 별칭 사용 */

select 1 as case, count(*) cnt

  from (select 컬럼

  from A t where 조건

  and exists (select 1 from B where 컬럼 = t.컬럼)) a, 테이블 b

where 조건

union all

select 2 as case, count(*) cnt

...

where 위와 다른 조건

 

==============

위의 쿼리는 속도가 한도 끝도 없네요...플랜 보면 임시 뷰 테이블에 풀 스캔 타고요...

아래 쿼리는 속도 문제는 없는데 with절 재활용이 아니구요...

(뭐 당연한거겠지만 아래 쿼리의 속도는 단일 쿼리 각각 2번 돌리는 것보다는 조금 더 걸리긴 합니다.)

==============

/* from절 내에 임시 뷰 테이블 생성 */

select 1 as case, count(*) cnt

  from (with ... )

  select ...

union all

select 2 as case, count(*) cnt

  from (with ... )

  select ...

by 마농 [2014.12.17 17:40:19]
-- 동일 테이블을 여러번 읽어 카운트하는 경우인 듯 한데요.
-- 이 경우 한번만 읽고 처리가 가능한 경우가 많습니다.
-- 각 조건들 중 공통조건은 Where 절에 남겨두고
-- 개별 조건은 Case 로 빼내어 카운트 하면 됩니다.

SELECT COUNT(CASE WHEN 조건1 THEN 1 END) cnt1
     , COUNT(CASE WHEN 조건2 THEN 1 END) cnt2
  FROM t
 WHERE 공통조건
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입