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) ;
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가 느릴수밖에 없는건지 아니면 인덱스를 사용하면 속도를 잡을수 있는건지 모르겠습니다. ㅜㅜ
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 ) ;