outer join시 index 설정방법 문의 0 6 1,885

by 초보개발자입니다! [Oracle 기초] index outer join [2019.01.02 18:26:21]


이미지 831.jpg (107,715Bytes)

SELECT COUNT (*) AS ROW_CNT
FROM   VIEW A,
       TABLE B
WHERE  A.a=B.a(+)

위의 쿼리를 실행하면 너무 오래걸려 확인해보니

A라는 VIEW가 

 SELECT *
 FROM   테이블 a
        FULL OUTER JOIN
               ( select *
               from    ( select  row_number( ) over (partition by c.컬럼 order by c.컬럼 desc ) seq,
                                c.*
                       from     테이블 c
                       )
                       d
               where   seq = '1'
               )
               b
        on     ( a.컬럼= b.컬럼 or a.컬럼 = b.컬럼 or a.컬럼 = b.컬럼 )


 

대략 이렇게 FULL OUTER JOIN을 사용하고 ON절 안에 3가지 조건이 있는 상황입니다.

SELECT 자체는 1초대이나 COUNT절을 사용하니 8초가 넘어가는 상황입니다...

1초대까지는 그렇다쳐도 COUNT가 너무오래걸려 애를 먹고있습니다.

INDEX를 어디다 어떤식으로 걸어야 COUNT절 속도가 줄어들수 있을까요?

도와주세요~~ㅠㅠ

 

쿼리 실행계획은 파일첨부에 올렸습니다.

도와주세요 형님들

-----------------------

수정하겠습니다. 실제 쿼리는 아래와같습니다.

 SELECT *
   FROM EX_IF_GIC_002 a FULL OUTER JOIN ( select *
                                                 from ( SELECT ROW_NUMBER() OVER (PARTITION BY c.vssl_innb
                                                         ORDER BY c.ETRYPT_DT DESC ) SEQ,
                                                               c.*
                                                          FROM EXT_IF_PMS_001 c) d
                                                where seq = '1') b on (a.SHIP_NO_3 = b.VSSL_NO or a.IMO_NO = b.IMO_NO or a.CALLSIGN = b.CLSGN) ;

 

by 마농 [2019.01.03 09:08:18]

쿼리에 테이블명이나 컬럼명이 불분명하여 판단하기 어렵네요.
실행계획을 보면 조인하면서 건수가 너무 뻥튀기 되는 느낌이 있내요.
조인 조건이 맞게 주어진 것인지 의심가는 부분이네요.


by 초보개발자입니다! [2019.01.03 11:54:07]
SELECT *
 FROM   테이블1 a
        FULL OUTER JOIN
               ( select *
               from    ( select  row_number( ) over (partition by c.컬럼 order by c.컬럼 desc ) seq,
                                c.*
                       from     테이블2 c
                       )
                       d
               where   seq = '1'
               )
               b
        on     ( a.컬럼= b.컬럼 or a.컬럼 = b.컬럼 or a.컬럼 = b.컬럼 )

-----------------------------------------------------------------------------------------------------------------

테이블1 이라는 테이블과 테이블2 라는 테이블을 FULL OUTER JOIN 하는 상황이며 
테이블2의 경우 중복되는 값을 없에고자 
------------------------------------------------------------------------------------------------------------

( select *
               from    ( select  row_number( ) over (partition by c.컬럼 order by c.컬럼 desc ) seq,
                                c.*
                       from     테이블2 c
                       )
                       d
               where   seq = '1'
               )
               b

----------------------------------------------------------------------------------------------------------
이 구문을 사용해 중복값을 제거한 b라는 임시테이블을 사용하여 FULL OUTER JOIN을 하는 상황입니다

비교 조건이 총 3개인 상황입니다

제가 이렇게 작성하여 더 복잡해 보일수 있으니 
 

SELECT * FROM 테이블1 a FULL OUTER JOIN 테이블2 b
on ( a.컬럼1= b.컬럼4 or a.컬럼2 = b.컬럼5 or a.컬럼3 = b.컬럼6 )

이렇게 놓고 봤을때 인덱스를 1,2,3 다중으로도 걸어보고 따로따로도 걸어봤는데 속도 개선이 없었습니다. 
 

FULL OUTER JOIN 은 어쩔수없이 COUNT가 느릴수밖에 없는건지 아니면 인덱스를 사용하면 속도를 잡을수 있는건지 모르겠습니다. ㅜㅜ


by 마농 [2019.01.03 13:01:02]

왜? full outer join 인지?
왜? Or 조건을 쓰는지?
왜? Select * 를 쓰는지?


by 초보개발자입니다! [2019.01.03 14:11:41]

1. ON조건에 부합하지 않는 데이터도 조회가 필요하여 FULL OUTER JOIN 을 사용하였습니다

2. 저 3가지 조건을 다 부합하는 경우는 거의없고 3가지 조건중에 하나만 부합되어도 되기에 OR조건을 사용하였습니다 

3. 원래는 SELECT *가 아닌 사용할 컬럼명들을 일일이 나열하였지만 질문쿼리에 일일이 적기보다 *로 대체한것입니다.

 


by 마농 [2019.01.03 16:02:42]
SELECT /*+ opt_param('_optimizer_native_full_outer_join', 'force') */
       *
  FROM ex_if_gic_002 a
  FULL OUTER JOIN
       (SELECT *
          FROM (SELECT ROW_NUMBER() OVER (PARTITION BY c.vssl_innb ORDER BY c.etrypt_dt DESC) seq
                     , c.*
                  FROM ext_if_pms_001 c
                ) d
         WHERE seq = 1
        ) b
    ON ( a.ship_no_3 = b.vssl_no OR
         a.imo_no    = b.imo_no  OR
         a.callsign  = b.clsgn   )
;

 


by 초보개발자입니다! [2019.01.03 16:26:40]

OPT_PARAM 이란것에 대해 공부해보겠습니다.

제 질문이 난잡해서 답변하기 어려우셨을텐데 관심가져 주셔서 감사합니다 ^^

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입