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 |