배타적 관계를 이용한 outer join이 항상 빠르지는 않나요?
mosquitt 수험생

답변 채택시 : 0코아

답변 1 추천 0 조회 2459 2003.07.04
튜닝실무를 하다가 이해가 되지 않는 부분이 있어 자문을 부탁드립니다. 업무배경 및 환경과 문제점은 다음과 같습니다. acd_slip 테이블은 acd_line_item이나 acd_clearing 둘 중 하나와 반드시 조인됩니다. (배타적 관계 모델이 적용됨) acd_slip + acd_line_item이 없으면 acd_slip + acd_clearing이 존재합니다. 조인키: pk_accnt_unt, pk_accnt_year, pk_slp_set_no, pk_slp_seq_no 위 테이블들을 이용해 배치작업을 하는 프로그램이 있는데 결과는 1154766 건 정도가 INSERT 되며 소요시간은 25분 정도입니다.(수정 전 SQL) 수정 전 SQL은 acd_slip 마스터 테이블과 coc002, coo006, acb_accnt 테이블을 2번씩 access합니다. 해당 테이블들을 한번씩만 access하도록 하면 작업속도가 훨씬 빨라질 것 같아 배타적관계를 이용해 outer join을 써서 Query를 수정해 보았습니다. 결과는 1154766 건이 동일하게 INSERT 되는데, 소요시간이 50분으로 2배 이상 걸렸습니다. 4개 테이블에 대한 access는 의도한대로 한번씩으로 줄었지만, coc002 테이블을 index scan하던 것에서 full scan으로 바뀌면서 시간이 더 걸렸습니다. 테이블 access를 반으로 줄였으므로 coc002 테이블을 full scan 하더라도 더 나은 성능을 보일 줄 알았는데 결과는 정반대였습니다. 그리고 갑자기 coc002 테이블이 file_no 컬럼에 대한 인덱스를 타지 않게 된 이유를 모르겠습니다. -- 각 테이블 설명 1. ACD_SLIP(전표 Master, 공통부분, 300만건) ------------------------------------------------------------------------------- pk_accnt_unt 전표구분(PK 컬럼 01) pk_accnt_year 전표연도(PK 컬럼 02) pk_slp_set_no 전표SET(PK 컬럼 03) pk_slp_seq_no 전표SEQ(PK 컬럼 04) accnt_cd FK 계정코드(acb_accnt.pk_accnt_cd 참조) NOT NULL won_amt 전표 금액 post_dt 기장일자 fileno 파일번호(FK, coc002.file_no 참조) ... 2. ACD_LINE_ITEM(전표 Master, 발생전표 관리항목, 200만건) ------------------------------------------------------------------------------- pk_accnt_unt 전표구분(PK 컬럼 01) pk_accnt_year 전표연도(PK 컬럼 02) pk_slp_set_no 전표SET(PK 컬럼 03) pk_slp_seq_no 전표SEQ(PK 컬럼 04) vendor_cd 상대처코드 ... 3. ACD_CLEARING(전표 Master, 반제전표 관리항목, 100만건) ------------------------------------------------------------------------------- pk_accnt_unt 전표구분(PK 컬럼 01) pk_accnt_year 전표연도(PK 컬럼 02) pk_slp_set_no 전표SET(PK 컬럼 03) pk_slp_seq_no 전표SEQ(PK 컬럼 04) real_partner 실지급처 ... 4. ACB_ACCNT(계정과목, 500건) ------------------------------------------------------------------------------- pk_accnt_cd 계정코드(PK) accnt_nm 계정명 ... 5. COO006 결산작업용 계정분류(300건) ------------------------------------------------------------------------------- insd_rate_acc 계정코드(PK) intr_div 작업구분 ... 6. COC002 결산작업용 파일내역 테이블(3만건) ------------------------------------------------------------------------------- file_no 파일번호(PK) team_cd 팀코드 item_cd 아이템코드 ... ================================================================================= (수정 전 SQL) INSERT INTO t_before (SELECT NVL(a.ccid, 0), a.pk_accnt_unt, a.pk_accnt_year, a.pk_slp_set_no, a.pk_slp_seq_no, ' ', ' ', ' ', 0, NVL(RTRIM(a.dbt_or_crt),'0'), NVL(RTRIM(a.clear),'0'), NVL(RTRIM(a.clear_or_not),'N'), NVL(RTRIM(a.slp_tp),'1'), NVL(RTRIM(c.fileno),' '), NVL(b.level1,0), NVL(b.level2,0), NVL(b.level3,0), NVL(a.accnt_cd,0), NVL(b.repay_tp,'X'), NVL(RTRIM(a.blngd_team),' '), NVL(a.won_amt,0), NVL(c.won_remains,0), NVL(RTRIM(a.stndrd_remrk),' '), NVL(to_char(a.trade_dt,'YYYYMMDD'),'99991231'), NVL(to_char(a.pst_dt,'YYYYMMDD'),'99991231'), NVL(e.item_cd,'99999'), NVL(d.intr_div,'1'), NVL(e.jata,'3') FROM acd_slip a, acb_accnt b, acd_line_item c, coo006 d, coc002 e WHERE a.slp_stts = '9' AND a.pk_accnt_unt = 'HDC' AND a.pst_dt >= TO_DATE('00010101','YYYYMMDD') AND a.pst_dt <= TO_DATE('20030630','YYYYMMDD') AND a.accnt_cd = b.pk_accnt_cd AND b.inputbl_or_n = 'Y' AND b.pk_accnt_cd = d.insd_rate_acc AND d.app_div = 'Y' AND a.pk_accnt_unt = c.pk_accnt_unt AND a.pk_accnt_year = c.pk_accnt_year AND a.pk_slp_set_no = c.pk_slp_set_no AND a.pk_slp_seq_no = c.pk_slp_seq_no AND a.fileno = e.file_no(+)) UNION (SELECT NVL(a.ccid,0), a.pk_accnt_unt, a.pk_accnt_year, a.pk_slp_set_no, a.pk_slp_seq_no, c.clr_accnt_unit, c.clr_accnt_year, c.clr_slp_set_no, c.clr_slp_seq_no, NVL(RTRIM(a.dbt_or_crt),'0'), NVL(RTRIM(a.clear),'0'), NVL(RTRIM(a.clear_or_not),'N'), NVL(RTRIM(a.slp_tp),'1'), NVL(RTRIM(c.fileno),' '), NVL(b.level1,0), NVL(b.level2,0), NVL(b.level3,0), NVL(a.accnt_cd,0), NVL(b.repay_tp,'X'), NVL(RTRIM(a.blngd_team),' '), NVL(a.won_amt,0), NVL(c.won_remains,0), NVL(RTRIM(a.stndrd_remrk),' '), NVL(to_char(a.trade_dt,'YYYYMMDD'),'99991231'), NVL(to_char(a.pst_dt,'YYYYMMDD'),'99991231'), NVL(e.item_cd,'99999'), NVL(d.intr_div,'1'), NVL(e.jata,'3') FROM acd_slip a, acb_accnt b, acd_clearing c, coo006 d, coc002 e WHERE a.slp_stts = '9' AND a.pk_accnt_unt = 'HDC' AND a.pst_dt >= TO_DATE('00010101','YYYYMMDD') AND a.pst_dt <= TO_DATE('20030630','YYYYMMDD') AND a.accnt_cd = b.pk_accnt_cd AND b.inputbl_or_n = 'Y' AND b.pk_accnt_cd = d.insd_rate_acc AND d.app_div = 'Y' AND a.pk_accnt_unt = c.pk_accnt_unt AND a.pk_accnt_year = c.pk_accnt_year AND a.pk_slp_set_no = c.pk_slp_set_no AND a.pk_slp_seq_no = c.pk_slp_seq_no AND a.fileno = e.file_no(+)); (수정 전 실행계획) call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.08 0.08 0 3 0 0 Execute 1 211.35 1096.00 356071 8274585 104765 1154766 Fetch 0 0.00 0.00 0 0 0 0 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 2 211.43 1096.08 356071 8274588 104765 1154766 Rows Execution Plan ------- --------------------------------------------------- 0 INSERT STATEMENT GOAL: CHOOSE 1154766 SORT (UNIQUE) 1154766 UNION-ALL 850287 NESTED LOOPS (OUTER) 850287 NESTED LOOPS 1154766 HASH JOIN 290 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'COO006' 1588100 HASH JOIN 424 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'ACB_ACCNT' 1588100 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ACD_SLIP' 1656788 INDEX (RANGE SCAN) OF 'IDX_ACD_SLIP05' (NON-UNIQUE) 850287 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ACD_LINE_ITEM' 850287 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'PKLINEITEM' (UNIQUE) 594653 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'COC002' 594653 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'PKCOC002' (UNIQUE) 304479 NESTED LOOPS (OUTER) 304479 NESTED LOOPS 1154766 HASH JOIN 290 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'COO006' 1588100 HASH JOIN 424 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'ACB_ACCNT' 1588100 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ACD_SLIP' 1656788 INDEX (RANGE SCAN) OF 'IDX_ACD_SLIP05' (NON-UNIQUE) 304479 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ACD_CLEARING' 304479 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'PKCLEAR' (UNIQUE) 224848 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'COC002' 224848 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'PKCOC002' (UNIQUE) ==================================================================================== (수정 후 SQL) INSERT INTO t_after SELECT NVL(a.ccid,0), a.pk_accnt_unt, a.pk_accnt_year, a.pk_slp_set_no, a.pk_slp_seq_no, DECODE(c.pk_slp_seq_no, NULL, d.clr_accnt_unit, ' '), DECODE(c.pk_slp_seq_no, NULL, d.clr_accnt_year, ' '), DECODE(c.pk_slp_seq_no, NULL, d.clr_slp_set_no, ' '), DECODE(c.pk_slp_seq_no, NULL, d.clr_slp_seq_no, 0), NVL(RTRIM(a.dbt_or_crt),'0'), NVL(RTRIM(a.clear),'0'), NVL(RTRIM(a.clear_or_not),'N'), NVL(RTRIM(a.slp_tp),'1'), DECODE(c.pk_slp_seq_no, NULL, NVL(RTRIM(d.fileno),' '), NVL(RTRIM(c.fileno),' ')), NVL(b.level1,0), NVL(b.level2,0), NVL(b.level3,0), NVL(a.accnt_cd,0), NVL(b.repay_tp,'X'), NVL(RTRIM(a.blngd_team),' '), NVL(a.won_amt,0), DECODE(c.pk_slp_seq_no, NULL, NVL(d.won_remains,0), NVL(c.won_remains,0)), NVL(RTRIM(a.stndrd_remrk),' '), NVL(to_char(a.trade_dt,'YYYYMMDD'),'99991231'), NVL(to_char(a.pst_dt,'YYYYMMDD'),'99991231'), NVL(f.item_cd,'99999'), NVL(e.intr_div,'1'), NVL(f.jata,'3') FROM acd_slip a, acb_accnt b, acd_line_item c, acd_clearing d, coo006 e, coc002 f WHERE a.slp_stts = '9' AND a.pk_accnt_unt = 'HDC' AND a.pst_dt >= TO_DATE('00010101','YYYYMMDD') AND a.pst_dt <= TO_DATE('20030630','YYYYMMDD') AND a.accnt_cd = b.pk_accnt_cd AND b.inputbl_or_n = 'Y' AND b.pk_accnt_cd = e.insd_rate_acc AND e.app_div = 'Y' AND a.pk_accnt_unt = c.pk_accnt_unt(+) AND a.pk_accnt_year = c.pk_accnt_year(+) AND a.pk_slp_set_no = c.pk_slp_set_no(+) AND a.pk_slp_seq_no = c.pk_slp_seq_no(+) AND a.pk_accnt_unt = d.pk_accnt_unt(+) AND a.pk_accnt_year = d.pk_accnt_year(+) AND a.pk_slp_set_no = d.pk_slp_set_no(+) AND a.pk_slp_seq_no = d.pk_slp_seq_no(+) AND a.fileno = f.file_no(+); (수정 후 실행계획) call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.51 0.63 0 0 0 0 Execute 1 213.69 3108.87 542481 6051149 104476 1154766 Fetch 0 0.00 0.00 0 0 0 0 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 2 214.20 3109.51 542481 6051149 104476 1154766 Rows Execution Plan ------- --------------------------------------------------- 0 INSERT STATEMENT GOAL: CHOOSE 1154766 NESTED LOOPS (OUTER) 1154766 NESTED LOOPS (OUTER) 1154766 HASH JOIN 290 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'COO006' 1588100 HASH JOIN (OUTER) 1588100 HASH JOIN 424 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'ACB_ACCNT' 1588100 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ACD_SLIP' 1656788 INDEX (RANGE SCAN) OF 'IDX_ACD_SLIP05' (NON-UNIQUE) 24709 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'COC002' 304479 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ACD_CLEARING' 304479 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'PKCLEAR' (UNIQUE) 850287 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ACD_LINE_ITEM' 850287 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'PKLINEITEM' (UNIQUE)
댓글 (0)
목록 답변등록
배타적 관계를 이용한 outer join이 항상 빠르지는 않나요?
easttree 2003.07.09
안녕하세요? 튜닝전과 튜닝후의 속도차이는 배타적인관계, 중복제거 등과 관련이 없고 트레이스에 보이는 것 처럼 disk io량에 따라 속도차이가 나타난 걸로 생각됩니다. (튜닝전의 데이터가 튜닝후 보다 디 스크보다 메모리에서 더 많이 처리) 배치처리와 같은 대량의 데이터를 다루는 SQL에서 테이블을 중복해서 access하는 것은 조인방법 및 access방법(Random)에 비해 속도에 큰 영향을 미치지 않습니다. -- 전체범위:부분범위, Random Access 량 주어진 상수조건이 제공된다하더라도 전체 300만건이 150만건으로 줄어들므로 조건이 별 효용이 없다고 생각되며 인덱스를 사용하여 NL로 풀릴 경우 Random Access부하로 인한 비효율이 클 것입 니다. 이 경우 거의 대부분을 처리해야 하므로 모든 테이블을 full table scan하여 hash join하면 속도 향상이 있을 것입니다. 또한 DB_FILE_MULTIBLOCK_READ_COUNT, HASH_MULTIBLOCK_IO_COUNT 및 HASH_AREA_SIZE를 적당히 크 게 지정해 주셔야 합니다. 예) ALTER SESSION SET DB_FILE_MULTIBLOCK_READ_COUNT=64; ALTER SESSION SET HASH_MULTIBLOCK_IO_COUNT = 64; ALTER SESSION SET HASH_AREA_SIZE = 41943040; INSERT INTO t_after SELECT /*+ ORDERED USE_HASH(A B C D E F) FULL(A) FULL(B) FULL(C) FULL(D) FULL(E) FULL (F) */ ... FROM acb_accnt b, acd_slip a, coo006 e, acd_line_item c, acd_clearing d, coc002 f -- 기술순서 변경 WHERE ... >> 황금옥 님께서 작성한 글입니다 --------------------------------------------------------------------------------- 튜닝실무를 하다가 이해가 되지 않는 부분이 있어 자문을 부탁드립니다. 업무배경 및 환경과 문제점은 다음과 같습니다. acd_slip 테이블은 acd_line_item이나 acd_clearing 둘 중 하나와 반드시 조인됩니다. (배타적 관계 모델이 적용됨) acd_slip + acd_line_item이 없으면 acd_slip + acd_clearing이 존재합니다. 조인키: pk_accnt_unt, pk_accnt_year, pk_slp_set_no, pk_slp_seq_no 위 테이블들을 이용해 배치작업을 하는 프로그램이 있는데 결과는 1154766 건 정도가 INSERT 되며 소요시간은 25분 정도입니다.(수정 전 SQL) 수정 전 SQL은 acd_slip 마스터 테이블과 coc002, coo006, acb_accnt 테이블을 2번씩 access합니다. 해당 테이블들을 한번씩만 access하도록 하면 작업속도가 훨씬 빨라질 것 같아 배타적관계를 이용해 outer join을 써서 Query를 수정해 보았습니다. 결과는 1154766 건이 동일하게 INSERT 되는데, 소요시간이 50분으로 2배 이상 걸렸습니다. 4개 테이블에 대한 access는 의도한대로 한번씩으로 줄었지만, coc002 테이블을 index scan하던 것에서 full scan으로 바뀌면서 시간이 더 걸렸습니다. 테이블 access를 반으로 줄였으므로 coc002 테이블을 full scan 하더라도 더 나은 성능을 보일 줄 알았는데 결과는 정반대였습니다. 그리고 갑자기 coc002 테이블이 file_no 컬럼에 대한 인덱스를 타지 않게 된 이유를 모르겠습니다. -- 각 테이블 설명 1. ACD_SLIP(전표 Master, 공통부분, 300만건) ------------------------------------------------------------------------------- pk_accnt_unt 전표구분(PK 컬럼 01) pk_accnt_year 전표연도(PK 컬럼 02) pk_slp_set_no 전표SET(PK 컬럼 03) pk_slp_seq_no 전표SEQ(PK 컬럼 04) accnt_cd FK 계정코드(acb_accnt.pk_accnt_cd 참조) NOT NULL won_amt 전표 금액 post_dt 기장일자 fileno 파일번호(FK, coc002.file_no 참조) ... 2. ACD_LINE_ITEM(전표 Master, 발생전표 관리항목, 200만건) ------------------------------------------------------------------------------- pk_accnt_unt 전표구분(PK 컬럼 01) pk_accnt_year 전표연도(PK 컬럼 02) pk_slp_set_no 전표SET(PK 컬럼 03) pk_slp_seq_no 전표SEQ(PK 컬럼 04) vendor_cd 상대처코드 ... 3. ACD_CLEARING(전표 Master, 반제전표 관리항목, 100만건) ------------------------------------------------------------------------------- pk_accnt_unt 전표구분(PK 컬럼 01) pk_accnt_year 전표연도(PK 컬럼 02) pk_slp_set_no 전표SET(PK 컬럼 03) pk_slp_seq_no 전표SEQ(PK 컬럼 04) real_partner 실지급처 ... 4. ACB_ACCNT(계정과목, 500건) ------------------------------------------------------------------------------- pk_accnt_cd 계정코드(PK) accnt_nm 계정명 ... 5. COO006 결산작업용 계정분류(300건) ------------------------------------------------------------------------------- insd_rate_acc 계정코드(PK) intr_div 작업구분 ... 6. COC002 결산작업용 파일내역 테이블(3만건) ------------------------------------------------------------------------------- file_no 파일번호(PK) team_cd 팀코드 item_cd 아이템코드 ... ================================================================================= (수정 전 SQL) INSERT INTO t_before (SELECT NVL(a.ccid, 0), a.pk_accnt_unt, a.pk_accnt_year, a.pk_slp_set_no, a.pk_slp_seq_no, ' ', ' ', ' ', 0, NVL(RTRIM(a.dbt_or_crt),'0'), NVL(RTRIM(a.clear),'0'), NVL(RTRIM(a.clear_or_not),'N'), NVL(RTRIM(a.slp_tp),'1'), NVL(RTRIM(c.fileno),' '), NVL(b.level1,0), NVL(b.level2,0), NVL(b.level3,0), NVL(a.accnt_cd,0), NVL(b.repay_tp,'X'), NVL(RTRIM(a.blngd_team),' '), NVL(a.won_amt,0), NVL(c.won_remains,0), NVL(RTRIM(a.stndrd_remrk),' '), NVL(to_char(a.trade_dt,'YYYYMMDD'),'99991231'), NVL(to_char(a.pst_dt,'YYYYMMDD'),'99991231'), NVL(e.item_cd,'99999'), NVL(d.intr_div,'1'), NVL(e.jata,'3') FROM acd_slip a, acb_accnt b, acd_line_item c, coo006 d, coc002 e WHERE a.slp_stts = '9' AND a.pk_accnt_unt = 'HDC' AND a.pst_dt >= TO_DATE('00010101','YYYYMMDD') AND a.pst_dt <= TO_DATE('20030630','YYYYMMDD') AND a.accnt_cd = b.pk_accnt_cd AND b.inputbl_or_n = 'Y' AND b.pk_accnt_cd = d.insd_rate_acc AND d.app_div = 'Y' AND a.pk_accnt_unt = c.pk_accnt_unt AND a.pk_accnt_year = c.pk_accnt_year AND a.pk_slp_set_no = c.pk_slp_set_no AND a.pk_slp_seq_no = c.pk_slp_seq_no AND a.fileno = e.file_no(+)) UNION (SELECT NVL(a.ccid,0), a.pk_accnt_unt, a.pk_accnt_year, a.pk_slp_set_no, a.pk_slp_seq_no, c.clr_accnt_unit, c.clr_accnt_year, c.clr_slp_set_no, c.clr_slp_seq_no, NVL(RTRIM(a.dbt_or_crt),'0'), NVL(RTRIM(a.clear),'0'), NVL(RTRIM(a.clear_or_not),'N'), NVL(RTRIM(a.slp_tp),'1'), NVL(RTRIM(c.fileno),' '), NVL(b.level1,0), NVL(b.level2,0), NVL(b.level3,0), NVL(a.accnt_cd,0), NVL(b.repay_tp,'X'), NVL(RTRIM(a.blngd_team),' '), NVL(a.won_amt,0), NVL(c.won_remains,0), NVL(RTRIM(a.stndrd_remrk),' '), NVL(to_char(a.trade_dt,'YYYYMMDD'),'99991231'), NVL(to_char(a.pst_dt,'YYYYMMDD'),'99991231'), NVL(e.item_cd,'99999'), NVL(d.intr_div,'1'), NVL(e.jata,'3') FROM acd_slip a, acb_accnt b, acd_clearing c, coo006 d, coc002 e WHERE a.slp_stts = '9' AND a.pk_accnt_unt = 'HDC' AND a.pst_dt >= TO_DATE('00010101','YYYYMMDD') AND a.pst_dt <= TO_DATE('20030630','YYYYMMDD') AND a.accnt_cd = b.pk_accnt_cd AND b.inputbl_or_n = 'Y' AND b.pk_accnt_cd = d.insd_rate_acc AND d.app_div = 'Y' AND a.pk_accnt_unt = c.pk_accnt_unt AND a.pk_accnt_year = c.pk_accnt_year AND a.pk_slp_set_no = c.pk_slp_set_no AND a.pk_slp_seq_no = c.pk_slp_seq_no AND a.fileno = e.file_no(+)); (수정 전 실행계획) call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.08 0.08 0 3 0 0 Execute 1 211.35 1096.00 356071 8274585 104765 1154766 Fetch 0 0.00 0.00 0 0 0 0 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 2 211.43 1096.08 356071 8274588 104765 1154766 Rows Execution Plan ------- --------------------------------------------------- 0 INSERT STATEMENT GOAL: CHOOSE 1154766 SORT (UNIQUE) 1154766 UNION-ALL 850287 NESTED LOOPS (OUTER) 850287 NESTED LOOPS 1154766 HASH JOIN 290 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'COO006' 1588100 HASH JOIN 424 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'ACB_ACCNT' 1588100 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ACD_SLIP' 1656788 INDEX (RANGE SCAN) OF 'IDX_ACD_SLIP05' (NON-UNIQUE) 850287 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ACD_LINE_ITEM' 850287 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'PKLINEITEM' (UNIQUE) 594653 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'COC002' 594653 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'PKCOC002' (UNIQUE) 304479 NESTED LOOPS (OUTER) 304479 NESTED LOOPS 1154766 HASH JOIN 290 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'COO006' 1588100 HASH JOIN 424 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'ACB_ACCNT' 1588100 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ACD_SLIP' 1656788 INDEX (RANGE SCAN) OF 'IDX_ACD_SLIP05' (NON-UNIQUE) 304479 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ACD_CLEARING' 304479 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'PKCLEAR' (UNIQUE) 224848 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'COC002' 224848 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'PKCOC002' (UNIQUE) ==================================================================================== (수정 후 SQL) INSERT INTO t_after SELECT NVL(a.ccid,0), a.pk_accnt_unt, a.pk_accnt_year, a.pk_slp_set_no, a.pk_slp_seq_no, DECODE(c.pk_slp_seq_no, NULL, d.clr_accnt_unit, ' '), DECODE(c.pk_slp_seq_no, NULL, d.clr_accnt_year, ' '), DECODE(c.pk_slp_seq_no, NULL, d.clr_slp_set_no, ' '), DECODE(c.pk_slp_seq_no, NULL, d.clr_slp_seq_no, 0), NVL(RTRIM(a.dbt_or_crt),'0'), NVL(RTRIM(a.clear),'0'), NVL(RTRIM(a.clear_or_not),'N'), NVL(RTRIM(a.slp_tp),'1'), DECODE(c.pk_slp_seq_no, NULL, NVL(RTRIM(d.fileno),' '), NVL(RTRIM(c.fileno),' ')), NVL(b.level1,0), NVL(b.level2,0), NVL(b.level3,0), NVL(a.accnt_cd,0), NVL(b.repay_tp,'X'), NVL(RTRIM(a.blngd_team),' '), NVL(a.won_amt,0), DECODE(c.pk_slp_seq_no, NULL, NVL(d.won_remains,0), NVL(c.won_remains,0)), NVL(RTRIM(a.stndrd_remrk),' '), NVL(to_char(a.trade_dt,'YYYYMMDD'),'99991231'), NVL(to_char(a.pst_dt,'YYYYMMDD'),'99991231'), NVL(f.item_cd,'99999'), NVL(e.intr_div,'1'), NVL(f.jata,'3') FROM acd_slip a, acb_accnt b, acd_line_item c, acd_clearing d, coo006 e, coc002 f WHERE a.slp_stts = '9' AND a.pk_accnt_unt = 'HDC' AND a.pst_dt >= TO_DATE('00010101','YYYYMMDD') AND a.pst_dt <= TO_DATE('20030630','YYYYMMDD') AND a.accnt_cd = b.pk_accnt_cd AND b.inputbl_or_n = 'Y' AND b.pk_accnt_cd = e.insd_rate_acc AND e.app_div = 'Y' AND a.pk_accnt_unt = c.pk_accnt_unt(+) AND a.pk_accnt_year = c.pk_accnt_year(+) AND a.pk_slp_set_no = c.pk_slp_set_no(+) AND a.pk_slp_seq_no = c.pk_slp_seq_no(+) AND a.pk_accnt_unt = d.pk_accnt_unt(+) AND a.pk_accnt_year = d.pk_accnt_year(+) AND a.pk_slp_set_no = d.pk_slp_set_no(+) AND a.pk_slp_seq_no = d.pk_slp_seq_no(+) AND a.fileno = f.file_no(+); (수정 후 실행계획) call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.51 0.63 0 0 0 0 Execute 1 213.69 3108.87 542481 6051149 104476 1154766 Fetch 0 0.00 0.00 0 0 0 0 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 2 214.20 3109.51 542481 6051149 104476 1154766 Rows Execution Plan ------- --------------------------------------------------- 0 INSERT STATEMENT GOAL: CHOOSE 1154766 NESTED LOOPS (OUTER) 1154766 NESTED LOOPS (OUTER) 1154766 HASH JOIN 290 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'COO006' 1588100 HASH JOIN (OUTER) 1588100 HASH JOIN 424 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'ACB_ACCNT' 1588100 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ACD_SLIP' 1656788 INDEX (RANGE SCAN) OF 'IDX_ACD_SLIP05' (NON-UNIQUE) 24709 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'COC002' 304479 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ACD_CLEARING' 304479 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'PKCLEAR' (UNIQUE) 850287 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ACD_LINE_ITEM' 850287 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'PKLINEITEM' (UNIQUE) ---------------------------------------------------------------------------------
댓글 (0)