Oracle Tuning 강좌
성능 관점에서 효율적인 SQL 구성 1 2 99,999+

by 강정식 EXISTS 10046 Trace [2010.06.28]


튜닝 전

  추출하고자 하는 대상은 DEPT 테이블의 데이터임에도 불구하고 EMP 테이블과 조인을 시도하였다.

  결국 두 테이블의 관계가 1 : M 이므로 불필요하게 EMP 테이블을 모두 액세스하고 DISTINCT로 중복 제거를 하였다.

 
-- 성능 문제의 SQL 문장
SQL> SELECT DISTINCT D.*
     FROM   EMP  E, DEPT D
     WHERE  E.DEPTNO = D.DEPTNO;

Call     Count CPU Time Elapsed Time       Disk      Query    Current       Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse        1    0.000        0.003          0          0          0          0
Execute      1    0.000        0.000          0          0          0          0
Fetch        2   18.740       21.832      40358      44244          0          8
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total        4   18.740       21.835      40358      44244          0          8

Misses in library cache during parse: 1
Optimizer goal: ALL_ROWS
Parsing user: APPS (ID=44)

Rows     Row Source Operation
-------  ---------------------------------------------------
      0  STATEMENT
      8   HASH UNIQUE (cr=44244 pr=40358 pw=0 time=21831482 us)
10000000    HASH JOIN  (cr=44244 pr=40358 pw=0 time=20004628 us)
      9     TABLE ACCESS FULL DEPT (cr=3 pr=0 pw=0 time=120 us)
10000000     TABLE ACCESS FULL EMP (cr=44241 pr=40358 pw=0 time=109 us)
    
    

튜닝 후

  추출하고자 하는 대상만을 FROM절에 놓고 나머지는 체크만 하기 위해 EXISTS절에 위치시켰으며 이로 인해 수행속도가 대폭 감소되었다.

 
-- 추출하고자 하는 대상 테이블만을 FROM절에 위치시켰다.
SQL> SELECT D.*
     FROM   DEPT D
     WHERE  EXISTS (SELECT 1
                    FROM   EMP E
                    WHERE  E.DEPTNO = D.DEPTNO);

Call     Count CPU Time Elapsed Time       Disk      Query    Current       Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse        1    0.000        0.003          0          0          0          0
Execute      1    0.000        0.000          0          0          0          0
Fetch        2    0.000        0.042          7         24          0          8
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total        4    0.000        0.046          7         24          0          8

Misses in library cache during parse: 1
Optimizer goal: ALL_ROWS
Parsing user: APPS (ID=44)

Rows     Row Source Operation
-------  ---------------------------------------------------
      0  STATEMENT
      8   NESTED LOOPS SEMI (cr=24 pr=7 pw=0 time=7432 us)
      9    TABLE ACCESS FULL DEPT (cr=4 pr=0 pw=0 time=263 us)
      8    INDEX RANGE SCAN EMP_N1 (cr=20 pr=7 pw=0 time=42135 us)(Object ID 6652496)     
    

- 강좌 URL : http://www.gurubee.net/lecture/2134

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by camela [2010.11.14 17:14:48]
emp 테이블과 dept 테이블이 1:M 관계이므로 emp 테이블에 외래키를 설정해주고 emp 테이블과의 조인 없이 dept 테이블만 조회하는것도 좋을 듯 합니다.

by 참된신자 [2014.08.13 15:50:52]

감사합니다 :)

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