SQL 튜닝의 시작 (2013년)
FUNCTION 동작방식 이해하기 0 0 99,277

by 구루비스터디 FUNCTION [2018.07.14]


1. SELECT절에서 사용하는 FUNCTION의 동작방식

TEST Script



[테이블생성]

1.테이블의 데이터 건수는 100000 rows
1.1 테이블 생성
CREATE TABLE FUNCTION_TABLE AS
  SELECT LEVEL C1,
         MOD(LEVEL, 2) C2,
         CHR(65+MOD(LEVEL,26)) C3,
         MOD(LEVEL, 3) +1 C4
    FROM DUAL
 CONNECT BY LEVEL <= 100000;



1.2 인덱스 생성 및 통계정보 수집
CREATE UNIQUE INDEX IDX_FUNCTION_TABLE_C1 ON FUNCTION_TABLE(C1);
CREATE INDEX IDX_FUNCTION_TABLE ON FUNCTION_TABLE(C2,C3);
CREATE INDEX IDX_FUNCTION_TABLE_C4 ON FUNCTION_TABLE(C4);

EXEC dbms_stats.gather_table_stats(OWNNAME=>'SCOTT',TABNAME=>'FUNCTION_TABLE',CASCADE=>TRUE,ESTIMATE_PERCENT=>100) ;
--------------------------------------------------------------------------------------------------------------------


2.컬럼 C1 은 값의 종류가 100000가지, UNIQUE 값
2.1 테이블 생성
CREATE TABLE C1_CODE_NM AS
  SELECT LEVEL C1,
         LEVEL||'C2 CODE VALUE' C2,
         CHR(65+MOD(LEVEL,20)) C3,
         MOD(LEVEL,5) C4
    FROM DUAL
 CONNECT BY LEVEL <= 100000;


2.2 인덱스 생성 및 통계정보 수집
CREATE UNIQUE INDEX IDX_C1_CODE_NM ON C1_CODE_NM(C1);

EXEC dbms_stats.gather_table_stats(OWNNAME=>'SCOTT',TABNAME=>'C1_CODE_NM',CASCADE=>TRUE,ESTIMATE_PERCENT=>100);
--------------------------------------------------------------------------------------------------------------------


3.컬럼 C2 는 값의 종류가 2가지
3.1 테이블 생성
CREATE TABLE C2_CODE_NM AS
SELECT MOD(LEVEL, 3) C1,
CHR(65+MOD(LEVEL,3)) C2
FROM DUAL
CONNECT BY LEVEL <= 3;


3.2 인덱스 생성 및 통계정보 수집
CREATE UNIQUE INDEX IDX_C2_CODE_NM ON C2_CODE_NM(C1);

EXEC dbms_stats.gather_table_stats(OWNNAME=>'SCOTT',TABNAME=>'C2_CODE_NM',CASCADE=>TRUE,ESTIMATE_PERCENT=>100) ;
--------------------------------------------------------------------------------------------------------------------

[컬럼 C1 값에 대한 코드명을 가져오는 FUNCTION 생성]
CREATE OR REPLACE FUNCTION FN_C1_CODENM(P_CODE NUMBER)
  RETURN VARCHAR2 IS
                 V_P_CODE_NM VARCHAR2(100);
BEGIN
      SELECT C2 INTO V_P_CODE_NM
        FROM C1_CODE_NM
       WHERE C1 = P_CODE;
    RETURN V_P_CODE_NM;
END;
--------------------------------------------------------------------------------------------------------------------

[컬럼 C2 값에 대한 코드명을 가져오는 FUNCTION 생성]
CREATE OR REPLACE FUNCTION FN_C2_CODENM(P_CODE NUMBER)
  RETURN VARCHAR2 IS
                 V_P_CODE_NM VARCHAR2(100);
BEGIN
      SELECT C2 INTO V_P_CODE_NM
        FROM C2_CODE_NM
       WHERE C1 = P_CODE;
     RETURN V_P_CODE_NM;
END;



CASE 1)10만 건을 가진 테스트 테이블을 조건없이 조회 한 경우


SELECT c1,
       fn_c1_codenm(c1) c2,c3
FROM FUNCTION_TABLE

Call     Count CPU Time Elapsed Time       Disk      Query    Current       Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse        1    0.000        0.000          0          0          0          0
Execute      1    0.000        0.000          0          0          0          0
Fetch     1001   15.194       15.431          0     301243          0     100000
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total     1003   15.194       15.431          0     301243          0     100000

Rows     Row Source Operation
-------  -----------------------------------------------------------------------
 100000  TABLE ACCESS FULL FUNCTION_TABLE (cr=1243 pr=0 pw=0 time=180 us)

********************************************************************************
-Main SQL의 추출 건수는 총 10만건
-CPU Time & Elapsed Time : 14초 이상 소요됨
-총 읽은 블록수 : 1243블록


[FUNCTION 수행내역]
SELECT C2 FROM C1_CODE_NM WHERE C1 = :B1

Call     Count CPU Time Elapsed Time       Disk      Query    Current       Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse        1    0.000        0.000          0          0          0          0
Execute 100000    1.732        1.779          0          0          0          0
Fetch   100000    1.061        1.166          0     300000          0     100000
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total   200001    2.792        2.945          0     300000          0     100000
********************************************************************************
-Recusive Call로 수행된 Function 수행내역
-Execute가 10만번으로 Main SQL에서 추출한 결과건수만큼 반복수행됨.
-Function을 수행함을써  30만 블록을 읽음

**Main SQL에서 추출하는 결과 건수가 많을때 Function의 사용은 비효율을 발생시킨다!


CASE 2)WHERE 절을 추가하여 추출 데이터를 줄인 경우


SELECT c1,
FN_C1_CODENM(c1) c2,
c3
FROM FUNCTION_TABLE
WHERE c2 = 0
AND c3 = 'A'

Call     Count CPU Time Elapsed Time       Disk      Query    Current       Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse        1    0.000        0.000          0          0          0          0
Execute      1    0.000        0.000          0          0          0          0
Fetch       40    0.764        0.747          0      11822          0       3846
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total       42    0.764        0.747          0      11822          0       3846

Rows     Row Source Operation
-------  -----------------------------------------------------------------------
   3846  TABLE ACCESS FULL FUNCTION_TABLE (cr=284 pr=0 pw=0 time=15470 us)

********************************************************************************

SELECT C2 FROM C1_CODE_NM WHERE C1 = :B1

Call     Count CPU Time Elapsed Time       Disk      Query    Current       Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse        1    0.000        0.000          0          0          0          0
Execute   3846    0.047        0.067          0          0          0          0
Fetch     3846    0.031        0.047          0      11538          0       3846
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total     7693    0.078        0.115          0      11538          0       3846

********************************************************************************
-FUNCTION의 수행횟수는 총 추출건수와 일치한다.



CASE 3)ROWNUM = 1 조건을 추가하여 1건이 추출되도록 유도한 경우

SELECT c1,
FN_C1_CODENM(c1) c2,
c3
FROM FUNCTION_TABLE
WHERE c2 = 0
AND c3 = 'A' AND ROWNUM = 1

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.016        0.012          0          7          0          1
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total        4    0.016        0.016          0          7          0          1

Rows     Row Source Operation
-------  -----------------------------------------------------------------------
      1  COUNT STOPKEY (cr=4 pr=0 pw=0 time=67 us)
      1   TABLE ACCESS FULL FUNCTION_TABLE (cr=4 pr=0 pw=0 time=62 us)

********************************************************************************

SELECT C2 FROM C1_CODE_NM WHERE C1 = :B1

Call     Count CPU Time Elapsed Time       Disk      Query    Current       Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse        1    0.000        0.000          0          0          0          0
Execute      1    0.000        0.000          0          0          0          0
Fetch        1    0.000        0.000          0          3          0          1
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total        3    0.000        0.000          0          3          0          1

********************************************************************************
-Function의 수행횟수는 Main SQL의 총 추출건수와 일치한다.
-Main SQL의 추출 건수가 적다면 Function을 사용하면 효율적이다!



SELECT절에 사용하는 FUNCTION

  • FUNCTION의 반복수행에 대한 원리와 실제 수행되는 시점을 명확하게 이해하고 잘 활용한다면 SQL 성능개선에 많은 도움이 된다.
  • SQL의 최종 추출건수가 많지 않다면 FUNCTION의 사용위치를 조정하여 성능을 개선 시킬 수 있다.


2.WHERE절에 사용하는 FUNCTION의 동작방식

CASE 1)T1을 먼저 수행하고 HASH JOIN 처리할 경우

SELECT /*+ LEADING(T1) USE_HASH(T1 T2) */
t1.*,
t2.*
FROM FUNCTION_TABLE t1,
C1_CODE_NM t2
WHERE t1.c2 = 0
AND t1.c3 = 'A'
AND t1.c1 = t2.c1
AND t2.c3 = FN_C2_CODENM(t2.c4)

Call     Count CPU Time Elapsed Time       Disk      Query    Current       Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse        1    0.078        0.078          0          2          0          0
Execute      1    0.000        0.000          0          0          0          0
Fetch        9   15.943       16.136          0     160745          0        768
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total       11   16.021       16.214          0     160747          0        768


Rows     Row Source Operation
-------  -----------------------------------------------------------------------
    768  HASH JOIN  (cr=160745 pr=0 pw=0 time=22188553 us)
   3846   TABLE ACCESS FULL FUNCTION_TABLE (cr=245 pr=0 pw=0 time=7750 us)
  15000   TABLE ACCESS FULL C1_CODE_NM (cr=160500 pr=0 pw=0 time=15706854 us)

********************************************************************************
-최종 추출건수 768건


SELECT C2 FROM C2_CODE_NM WHERE C1 = :B1

Call     Count CPU Time Elapsed Time       Disk      Query    Current       Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse        1    0.000        0.000          0          0          0          0
Execute 100000    1.872        1.764          0          0          0          0
Fetch   100000    0.936        0.827          0     160000          0      60000
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total   200001    2.808        2.591          0     160000          0      60000
********************************************************************************
-Function 수행 횟수 : 10만번 (SELECT절에 사용된 FUNCTION이라고 하면 Function 수행횟수는 768건이어야 하나 Where절 사용시에는 다름을 확인)

**WHERE 절에 사용된 FUNCTION은 최총 추출건수에 영향을 받는것이 아니라, 조인방법, 상수조건, 조인조건등의 좀더 복잡한 요인들에 영향을 받고 있다

-동작방식
  T1 은 T1.C2 = 0 AND T1.C3 = 'A' 조건으로 범위를 줄일 수 있지만,
 T2 테이블의 경우 상수 조건은 존재하지 않고 T2.C3 =FN_C2_CODENM (T2.C4) 조건이 있다.
 하지만 FUNCTION을 수행하기전에는 비교값을 알수가 없으므로 ,HASH 조인전에 T2 테이블 전체에 Function을 수행하여 T2.C3와 비교해가며 필터처리를 해야하므로
  T2 테이블의 전체 건수만큼 Function이 수행되었다.

 즉, Hash Join으로 수행될때 Where절의 Function은 조인처리 하기전 데이터를 걸러낼때 수행되어, T2 테이블 모든건수에 Function이 수행되는 비효율 발생


CASE 2)WHERE절에 T2테이블의 조건을 추가할 경우


SELECT /*+ LEADING(T1) USE_HASH(T1 T2) */
t1.*,
t2.*
FROM FUNCTION_TABLE t1,
C1_CODE_NM t2
WHERE t1.c2 = 0
AND t1.c3 = 'A'
AND t1.c1 = t2.c1
AND t2.c4 IN (2, 4) <-- 상수조건추가
AND t2.c3 = FN_C2_CODENM(t2.c4)

Call     Count CPU Time Elapsed Time       Disk      Query    Current       Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse        1    0.078        0.073          0          2          0          0
Execute      1    0.000        0.000          0          0          0          0
Fetch        5    6.755        6.785          0      60718          0        384
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total        7    6.833        6.857          0      60720          0        384

Rows     Row Source Operation
-------  -----------------------------------------------------------------------
    384  HASH JOIN  (cr=60718 pr=0 pw=0 time=6707817 us)
   3846   TABLE ACCESS FULL FUNCTION_TABLE (cr=245 pr=0 pw=0 time=7750 us)
   5000   TABLE ACCESS FULL C1_CODE_NM (cr=60473 pr=0 pw=0 time=9735727 us)

********************************************************************************


SELECT C2 FROM C2_CODE_NM WHERE C1 = :B1

Call     Count CPU Time Elapsed Time       Disk      Query    Current       Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse        1    0.000        0.000          0          0          0          0
Execute  40000    0.764        0.718          0          0          0          0
Fetch    40000    0.437        0.313          0      60000          0      20000
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total    80001    1.201        1.031          0      60000          0      20000

********************************************************************************
-Fucntion 수행횟수 : 4만번
-조인방법과 조인 순서는 CASE1 과 동일하나 t2.c4 IN (2, 4) 상수 조건이 추가되어 Function 수행횟수가 4만번으로 줄었다
-즉, T2.C3 = FN_C2_CODENM (T2.C4) 수행전 t2.c4 IN (2, 4)이 수행되면서 T2 테이블의 수행 범위를 줄여주었다.



CASE 3)조인방법이 NESTED LOOPS JOIN인 경우

SELECT /*+ LEADING(T1) USE_NL(T1 T2) */ <-- NL 조인변경
t1.*,
t2.*
FROM FUNCTION_TABLE t1,
C1_CODE_NM t2
WHERE t1.c2 = 0
AND t1.c3 = 'A'
AND t1.c1 = T2.c1
AND t2.c3 = FN_C2_CODENM(t2.C4)

Call     Count CPU Time Elapsed Time       Disk      Query    Current       Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse        1    0.078        0.074          0          2          0          0
Execute      1    0.000        0.000          0          0          0          0
Fetch        9    0.811        0.815          0      14109          0        768
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total       11    0.889        0.889          0      14111          0        768

Rows     Row Source Operation
-------  -----------------------------------------------------------------------
    768  NESTED LOOPS  (cr=14109 pr=0 pw=0 time=954523 us)
   3846   TABLE ACCESS FULL FUNCTION_TABLE (cr=253 pr=0 pw=0 time=19287 us)
    768   TABLE ACCESS BY INDEX ROWID C1_CODE_NM (cr=13856 pr=0 pw=0 time=787844 us)
   3846    INDEX UNIQUE SCAN IDX_C1_CODE_NM (cr=3856 pr=0 pw=0 time=25146 us)

********************************************************************************
-총 추출건수 768건
-CASE1과 비교해서 조인 방법이 변경됨(HASH JOIN -> NESTED LOOP JOIN)

SELECT C2 FROM C2_CODE_NM WHERE C1 = :B1

Call     Count CPU Time Elapsed Time       Disk      Query    Current       Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse        1    0.000        0.000          0          0          0          0
Execute   3846    0.062        0.069          0          0          0          0
Fetch     3846    0.078        0.032          0       6154          0       2308
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total     7693    0.140        0.101          0       6154          0       2308

********************************************************************************
-Function 수행횟수 : 3846번
-NL JOIN방식을 이용하여 수행한 결과
  선행테이블인 T1에서 추출된 데이터만큼 후행테이블(T2)에서 반복 수행되므로, 선행테이블에 영향을 받아 Function 수행 횟수가 CASE1에 비해 대폭 줄었다



CASE 4)T2에 T2.C4 IN(2,4) 상수 조건을 부여한 경우

SELECT /*+ LEADING(T1) USE_NL(T1 T2) */ <-- NL 조인 변경
t1.*,
t2.*
FROM FUNCTION_TABLE T1,
C1_CODE_NM T2
WHERE t1.c2 = 0
AND t1.c3 = 'A'
AND t1.c1 = t2.C1
AND t2.c4 IN (2, 4) <-- 상수 조건 추가
AND t2.c3 = FN_C2_CODENM(t2.c4)

Call     Count CPU Time Elapsed Time       Disk      Query    Current       Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse        1    0.062        0.073          0          2          0          0
Execute      1    0.000        0.000          0          0          0          0
Fetch        5    0.421        0.422          0      10254          0        384
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total        7    0.484        0.495          0      10256          0        384

Rows     Row Source Operation
-------  -----------------------------------------------------------------------
    384  NESTED LOOPS  (cr=10254 pr=0 pw=0 time=326832 us)
   3846   TABLE ACCESS FULL FUNCTION_TABLE (cr=249 pr=0 pw=0 time=15443 us)
    384   TABLE ACCESS BY INDEX ROWID C1_CODE_NM (cr=10005 pr=0 pw=0 time=402937 us)
   3846    INDEX UNIQUE SCAN IDX_C1_CODE_NM (cr=3852 pr=0 pw=0 time=17743 us)

********************************************************************************
-총 추출건수 384건
-T2의 상수 조건이 추가됨으로 인해 CASE3에 비해 총 추출건수만 줄어듦

SELECT C2 FROM C2_CODE_NM WHERE C1 = :B1

Call     Count CPU Time Elapsed Time       Disk      Query    Current       Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse        1    0.000        0.000          0          0          0          0
Execute   1538    0.094        0.028          0          0          0          0
Fetch     1538    0.016        0.012          0       2307          0        769
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total     3077    0.109        0.040          0       2307          0        769

********************************************************************************
-FUNCTION 수행횟수 : 1538번
-조인이 성공하자마자 FUNCTION 이 수행되는것이 아닌
  조인이 성공하더라도 후행 테이블에 상수로 비교할수 있는 다른조건이 있다면 이를 먼주 수행 후, 만족하는 데이터에 대해서 FUNCTION 수행.



CASE 5)T2부터 수행하고 NESTED LOOPS JOIN을 선택할 경우

SELECT /*+ LEADING(T2) USE_NL(T2 T1) */
t1.*,
t2.*
FROM FUNCTION_TABLE T1,
C1_CODE_NM T2
WHERE t1.c2 = 0
AND t1.c3 = 'A'
AND t1.c1 = t2.c1
AND t2.c3 = FN_C2_CODENM(t2.c4)

Call     Count CPU Time Elapsed Time       Disk      Query    Current       Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse        1    0.078        0.094          0          2          0          0
Execute      1    0.000        0.000          0          0          0          0
Fetch        9   16.224       16.525          0     190487          0        768
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total       11   16.302       16.619          0     190489          0        768

Rows     Row Source Operation
-------  -----------------------------------------------------------------------
    768  NESTED LOOPS  (cr=190487 pr=0 pw=0 time=22816889 us)
  15000   TABLE ACCESS FULL C1_CODE_NM (cr=160477 pr=0 pw=0 time=16495006 us)
    768   TABLE ACCESS BY INDEX ROWID FUNCTION_TABLE (cr=30010 pr=0 pw=0 time=161566 us)
  15000    INDEX UNIQUE SCAN IDX_FUNCTION_TABLE_C1 (cr=15010 pr=0 pw=0 time=93241 us)

********************************************************************************
-총 추출건수 : 768건
-조인순서의 변경 :  T1->T2에서 T2->T1 으로 변경됨

SELECT C2 FROM C2_CODE_NM WHERE C1 = :B1

Call     Count CPU Time Elapsed Time       Disk      Query    Current       Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse        1    0.000        0.000          0          0          0          0
Execute 100000    1.997        1.780          0          0          0          0
Fetch   100000    0.796        0.823          0     160000          0      60000
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total   200001    2.792        2.603          0     160000          0      60000
-FUNCTION 수행 횟수 : 10만번
-T2를 먼저 읽었으나 범위를 줄여줄수 있는 상수 조건이 존재하지 않아 t2.c3 = FN_C2_CODENM(t2.c4) 조건을 처리하기 위해
  컬럼 c4 값을 입력 값으로 Fucntion 을 수행하고, 그 결과가 c3 컬럼 값과 같은지 체크하는 동안 Function을 10만번 수행함.

** NL 조인의 Driving 테이블의 중요성을 알게된다.(선행테이블의 데이터가 많을수록 성능저하 발생)


CASE 6)T2부터 읽고 조인 방법은 NESTED LOOPS JOIN을 선택하며 상수 조건이 추가될 경우

SELECT /*+ LEADING(T2) USE_NL(T2 T1) */
t1.*,
t2.*
FROM FUNCTION_TABLE t1,
C1_CODE_NM t2
WHERE t1.c2 = 0
AND t1.c3 = 'A'
AND t1.c1 = t2.C1
AND t2.c4 IN (2, 4)<-- 상수조건 추가
AND t2.c3 = FN_C2_CODENM(t2.c4)

Call     Count CPU Time Elapsed Time       Disk      Query    Current       Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse        1    0.062        0.071          0          2          0          0
Execute      1    0.000        0.000          0          0          0          0
Fetch        5    6.786        6.951          0      70479          0        384
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total        7    6.848        7.022          0      70481          0        384

Rows     Row Source Operation
-------  -----------------------------------------------------------------------
    384  NESTED LOOPS  (cr=70479 pr=0 pw=0 time=6783632 us)
   5000   TABLE ACCESS FULL C1_CODE_NM (cr=60473 pr=0 pw=0 time=9929017 us)
    384   TABLE ACCESS BY INDEX ROWID FUNCTION_TABLE (cr=10006 pr=0 pw=0 time=55117 us)
   5000    INDEX UNIQUE SCAN IDX_FUNCTION_TABLE_C1 (cr=5006 pr=0 pw=0 time=33336 us)

********************************************************************************
-총 추출건수 : 384건

SELECT C2 FROM C2_CODE_NM WHERE C1 = :B1

Call     Count CPU Time Elapsed Time       Disk      Query    Current       Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse        1    0.000        0.000          0          0          0          0
Execute  40000    0.655        0.717          0          0          0          0
Fetch    40000    0.374        0.319          0      60000          0      20000
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total    80001    1.030        1.036          0      60000          0      20000

********************************************************************************
-FUNCTION 수행횟수 : 4만번
-상수조건으로 인해 FUNCTION 수행범위가 줄어듦


  • 조인방법, 조인순서, 상수 조건에 따라서 Function의 수행횟수의 차이 발생 확인
  • 테스트 SQL의 결과 T1->T2로 NL JOIN으로 수행될때 가장 성능이 좋음을 확인


테스트 결과요약
CASE조인순서조인방법T1데이터건수T2데이터건수조인후 추출건수FUNCTION수행횟수
1T1>T2HASH JOIN3,846100,000768100,000
2T1>T2HASH JOIN3,84640,00038440,000
3T1>T2NESTED LOOPS JOIN3,846100,0007683,846<--효율
4T1>T2NESTED LOOPS JOIN3,84640,0003841,538<--효율
5T2>T1NESTED LOOPS JOIN3,846100,000768100,000
6T2>T1NESTED LOOPS JOIN3,84640,00038440,000


WHERE절에 사용하는 FUNCTION

수행내역까지 분석하여 데이터 양에 따라 조인방법 및 조인순서를 고려하여 FUNCTION 수행을 최소한으로 줄여 DB 성능을 최적화 하자

"데이터베이스 스터디모임" 에서 2013년에 "SQL튜닝의시작 " 도서를 스터디하면서 정리한 내용 입니다.

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

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

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

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