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
'Oracle > Oracle 실무' 카테고리의 다른 글
[ DB | ORACLE ] 컬럼에 코멘트 추가하기 (0) | 2024.11.27 |
---|---|
[ DB | ORACLE ] 개행문자 및 공백없애기 (0) | 2024.09.23 |
[ DB | ORACLE ] DB Link 연결 시 ora-00904, ora-02063 에러 발생 (0) | 2024.05.09 |
[ DB | ORACLE ] DATE 형식이 맞는데 날짜 형식 지정에 불필요한 데이터가 포함되었다고 뜰 때 (0) | 2024.01.08 |
[ DB | ORACLE ] 각 컬럼별로 존재하는 테이블과 콤마로 이어져있는 컬럼 테이블을 join하기 (0) | 2023.12.29 |