안녕하세요. 한가지 궁금한사항이 있어서 문의 드립니다.
4개의 테이블을 서브쿼리로 조인해서 union all로 가져오는 SQL를 짰는데 비효율이 너무 많아서 문의 드립니다.
거의 비슷한 조건으로 union all하기때문에 case when 함수를 써서 처리할수 있을거 같은데.. 막혀서 진행이 안되네요..
문제의 SQL은 아래와 같습니다.
select a.bubcd, a,sa_no, '2' type
from tka01 a
where a.bub_cd =:001
and a.jindg_typcd in('1','3')
and a.jong_cd is null
and a.jin_cd <> 'A330'
and not exists(select 'Y'
from tka15 c
where c.bub_cd=a.bub_cd
and c.sa_no= a.sa_no
and not exists(select 'Y'
from tka17 b
where b.bub_cd=a.bub_cd
and b.sa_no=a.sa_no
and (a.bub_cd, a.sa_no) in (select d.bub_cd, d.sa_no from tsd01 d
where d.bub_cd=a.bub_cd
and d.sa_no=a.sa_no
and d.sys_cd ='WKA'
and d.sdb_day is not null
and d.sdg_cd is not null
and d.sdm_name like '%신청서본부%')
union all
select a.bubcd, a,sa_no, '3' type
from tka01 a
where a.bub_cd =:001
and a.jindg_typcd ='4'
and a.jong_cd is null
and a.jin_cd <> 'B150'
and not exists(select 'Y'
from tka15 c
where c.bub_cd=a.bub_cd
and c.sa_no= a.sa_no
and not exists(select 'Y'
from tka17 b
where b.bub_cd=a.bub_cd
and b.sa_no=a.sa_no
and (a.bub_cd, a.sa_no) in (select d.bub_cd, d.sa_no from tsd01 d
where d.bub_cd=a.bub_cd
and d.sa_no=a.sa_no
and d.sys_cd ='WKA'
and d.sdb_day is not null
and d.sdm_cd='518'
union all하는 테이블은 동일하며 조건이 다른것은 a.jing_typcd , a.jin_cd 부분과 서브쿼리의 in절에 쓰이는 d.sdm_name, sdm_cd만 다릅니다.
그리고 001에 대한 바인드 변수는 동일합니다.그 외의 조건은 동일합니다. case when 함수로 변경해서 하면 SQL 성능 개선이 같은데 어디부분을 수정해야될까요 ? 조언부탁드립니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | SELECT a.bubcd , a,sa_no , CASE WHEN a.jindg_typcd = '4' THEN '3' ELSE '2' END type FROM tka01 a WHERE a.bub_cd = :001 AND a.jindg_typcd IN ( '1' , '3' , '4' ) AND a.jong_cd IS NULL AND NOT EXISTS ( SELECT 1 FROM tka15 c WHERE c.bub_cd = a.bub_cd AND c.sa_no = a.sa_no) AND NOT EXISTS ( SELECT 1 FROM tka17 b WHERE b.bub_cd = a.bub_cd AND b.sa_no = a.sa_no) AND EXISTS ( SELECT 1 FROM tsd01 d WHERE d.bub_cd = a.bub_cd AND d.sa_no = a.sa_no AND d.sys_cd = 'WKA' AND d.sdb_day IS NOT NULL AND ( ( a.jindg_typcd IN ( '1' , '3' ) -- 2 AND a.jin_cd <> 'A330' -- 2 AND d.sdg_cd IS NOT NULL -- 2 AND d.sdm_name LIKE '%신청서본부%' -- 2 ) OR ( a.jindg_typcd = '4' -- 3 AND a.jin_cd <> 'B150' -- 3 AND d.sdm_cd= '518' -- 3 ) ) ) ; |