A 라는 집합에서 B 테이블의 b1 조합 제외, b2 조합 제외
SELECT *
FROM A
WHERE ...
AND NOT ( (A.COL1, A.COL2) IN ( SELECT
FROM B
WHERE ... )
OR (A.COL1, A.COL3) IN ( SELECT
FROM B
WHERE ... )
)
위 구조의 문제점
개발자들은 SQL 에 업무를 그냥 서술하는 경향이 있다.
위의 쿼리는 NOT IN 절에 조건을 계속 추가하는 식으로 작성이 되어있어서
A 의 조건을 만족하는 모든 ROW 에 대해서 NOT IN 절을 확인하게 되었있다.
NOT IN 절을 바꿔보자
AND NOT ((A.COL1, A.COL2, A.COL3) IN ( SELECT B.COL1
,DECODE(RN,1,B.COL2, A.COL2)
,DECODE(RN,1,A.COL3, B.COL3)
FROM B,
( SELECT ROWNUM RN
FROM ALL_OBJECTS
WHERE ROWNUM <=2
)BB
WHERE ...
)
)
조건에 따라서 COL1, COL2 또는 COL1,COL3 와 가공의 컬럼 RN 을 만들고 카티션 조인을 한다.
RN=1 인 경우 원본의 첫번째 NOT IN 이 되고
RN=2 인 경우 원본의 두번째 NOT IN 이 된다.
EX) RN=1 AND NOT ((A.COL1, A.COL2, A.COL3) IN ( B.COL1, B.COL2, A.COL3 )
RN=2 AND NOT ((A.COL1, A.COL2, A.COL3) IN ( B.COL1, A.COL2, B.COL3 )
가 된다.
'생계 > 튜닝' 카테고리의 다른 글
rac 환경 통계수집 후 no_invalidate (0) | 2023.06.10 |
---|---|
오라클 AWR 사용하기 (0) | 2023.05.13 |
[SQL]열거된 OR 제거하기. IN 사용 (0) | 2020.11.13 |
[SQL] 전월 증감 리포트 (0) | 2019.11.01 |
GROUP BY 로 가공되어 처리범위를 줄여주지 못하는 인라인뷰 (0) | 2019.11.01 |