[ DB | ORACLE ] Not in → join 으로 쿼리 성능 개선하기

728x90

 

 

not in ('aaa','bbb') 이렇게 쓰는 것은 상관이 없지만 여기에 서브쿼리가 들어가면 쿼리의 성능이 떨어진다는 블로그 글을 봤다.

그래서 문자열이 아닌 서브쿼리로 작성 된 NOT IN 쿼리를 수정 해 보았다.

( JOIN, LEFT JOIN을 통해 쿼리 성능을 높일 수 있다. )

 

쿼리 1

수정 전

SELECT 컬럼명 ...
FROM 테이블1
WHERE PROJ_NO = :PROJ_NO
	  AND (A컬럼 IS NULL OR A컬럼 = ' ')
	  AND (B컬럼 IS NULL OR B컬럼 = ' ')
	  AND C컬럼 IN (SELECT :PROJ_NO_3||A컬럼
                              FROM 테이블2
                              WHERE PROJ_NO = :PROJ_NO
                              AND B컬럼 IS NOT NULL)

 

수정 후 

SELECT 컬럼명 ...
FROM  테이블1 A JOIN ( SELECT :PROJ_NO_3||A컬럼 AS A컬럼
                                    FROM 테이블2
                                    WHERE PROJ_NO = :PROJ_NO
                                   AND B컬럼 IS NOT NULL) B
ON  A.C컬럼 = B.A컬럼
WHERE  A.PROJ_NO = :PROJ_NO
     AND (A.A컬럼 IS NULL OR A.A컬럼 = ' ')
     AND (A.B컬럼 IS NULL OR A.B컬럼 = ' ')

 


 

쿼리 2

 

수정 전

SELECT 컬럼명 ...
FROM 테이블1
WHERE PROJ_NO = @PROJ_NO
	  AND (A컬럼 IS NULL OR A컬럼 = ' ')
	  AND (B컬럼 IS NULL OR B컬럼 = ' ')
	  AND C컬럼 IN (SELECT :PROJ_NO_3||A컬럼
                              FROM 테이블2
                              WHERE PROJ_NO = :PROJ_NO
                                    AND B컬럼 IS NOT NULL

 

수정 후

SELECT 컬럼명 ...
FROM 테이블1 A JOIN ( SELECT :PROJ_NO_3||A컬럼 AS A컬럼
                   FROM 테이블2
                    WHERE PROJ_NO = @PROJ_NO
                   AND B컬럼 IS NOT NULL) B
ON  A.C컬럼 = B.A컬럼
WHERE  A.PROJ_NO = @PROJ_NO
AND (A.A컬럼 IS NULL OR A.A컬럼 = ' ')
AND (A.B컬럼 IS NULL OR A.B컬럼 = ' ')

 

쿼리3

수정 전

SELECT 컬럼명 ...
FROM 테이블1 
WHERE PROJ_NO = :PROJ_NO
	... 조건
	
	AND C컬럼 NOT IN (SELECT :PROJ_NO_3||A컬럼
					FROM 테이블2
					WHERE PROJ_NO = :PROJ_NO)

 

수정 후

SELECT 컬럼명 ...
FROM 테이블1 A left outer join 테이블2 B
ON A.A컬럼 = @PROJ_NO_3 || B.A컬럼
WHERE A.PROJ_NO = @PROJ_NO
    ... 조건
    AND B.PROJ_NO IS NULL

 

 

개선 전 개선 후 차이
334.011 초 45.486초 -288.525초 ( 86.53% )
728x90