본문 바로가기
Infra

SQL 튜닝 not exists

by GOMJ 2025. 10. 26.

SQL 쿼리를 작성할 때 부정문을 쓰지 말자고 했다.

 

그중 not exists를 outer join으로 변환하여 plan을 효율적으로 조정하는 방법에 대해 알아보겠다.

 

예전 내가 짰던 쿼리중 이런게 있었다.

select orz_cd
from a
where
not exists (select * from b where b.orz_cd = a.orz_cd and m_sal > 3000000);

 

실행계획을 보니 400M blocks 6 seconds 가 걸린다.

 

그럼 이걸 outer로 변경하면 어떻게 될까?

 

select orz_cd
from a, (select distinct b.orz_cd from b where  m_sal > 3000000) b
where
a.orz_cd = b.orz_cd(+)
and b.orz_cd is null;

 

쿼리만 변경했는데 40M blocks 2 seconds로 개선이 되었다.

 

혹시 쿼리중에 not exists가 있는데 outer join으로 변경시 인덱스를 태울 수 있다면 수정해 보는게 어떨까

'Infra' 카테고리의 다른 글

ORA 01795 IN절에 사용 가능한 목록의 최대 수  (0) 2025.11.02
tcp_fin_timeout란?  (0) 2025.11.02
L4 SNAT 세션 풀(Session Pool)  (0) 2025.10.26
SQL 튜닝 case when  (0) 2025.10.19
TCP 3-way Handshake  (0) 2025.10.19