본문 바로가기

오라클DBMS/SQL,PL/SQL

[오라클] 쿼리가 느려요? DB_LINK 테이블 서브쿼리로 JOIN


SELECT A.TYPE_CD, A.TYPE_NAME, B.FORM_CD, B.FORM_NAME, 
  0 AS CHK
FROM TF_APP_TYPE_CD A
  LEFT OUTER JOIN TF_APP_FORM_CD B ON A.TYPE_CD = B.TYPE_CD
WHERE 1 = 1
  AND A.USE_YN = '1' 
  AND B.USE_YN = '1' 
  AND A.TYPE_CD || B.FORM_CD NOT IN (
    SELECT SUB.TYPE_CD || SUB.FORM_CD
    FROM TF_APP_FIN_CHR_SETUP SUB
      LEFT OUTER JOIN VW_FIN_DEPT_LEVEL SUB2 ON SUB.DEPT_CD = SUB2.DEPT_CD
    WHERE 1 = 1
      AND SUB2.DEPT_CD IS NOT NULL
    GROUP BY SUB.TYPE_CD, SUB.FORM_CD
    )
ORDER BY A.TYPE_CD, B.FORM_CD;


느리다. 느린거로 발견됐다. 
원인은 VIEW 에 있었다.
VIEW를 단일로 실행하면 빠르지만 , 해당 쿼리와 함께하면  
너무 느린것이다.

이유는 VIEW는 DB_LINK로 연결된 테이블 3종으로 수행되는 쿼리
driving_site 힌트도 안먹는다?
 
원인은 모라고 테이블과의 조인조건 때문이다.
덤으로 에헤라디야 || 이노마디여 같은 가공조건이 INDEX사용을 방해했다. 


SELECT A.TYPE_CD, A.TYPE_NAME, B.FORM_CD, B.FORM_NAME, 
  0 AS CHK
FROM TF_APP_TYPE_CD A
  LEFT OUTER JOIN TF_APP_FORM_CD B ON A.TYPE_CD = B.TYPE_CD
WHERE 1 = 1
  AND A.USE_YN = '1'
  AND B.USE_YN = '1' 
  AND (A.TYPE_CD, B.FORM_CD) NOT IN (
  SELECT /*+ no_merge */ 
    A.TYPE_CD , A.FORM_CD
  FROM (
    SELECT   SUB.TYPE_CD , SUB.FORM_CD
    FROM TF_APP_FIN_CHR_SETUP SUB
      LEFT OUTER JOIN VW_FIN_DEPT_LEVEL SUB2 ON SUB.DEPT_CD = SUB2.DEPT_CD
    WHERE 1 = 1
      AND SUB2.DEPT_CD IS NOT NULL
    GROUP BY SUB.TYPE_CD, SUB.FORM_CD
    ) A
  )
ORDER BY A.TYPE_CD, B.FORM_CD
;

 
no_merge 로 묶어주면 view를 풀지 않고 수행하여 해결