조인방식
- nested loops : 드라이빙 테이블을 읽고, 드라이빙 테이블과 드리븐 테이블의 조인 키를 가지고 드리븐 테이블을 읽으며 행을 연결.
- 두 테이블의 연결 횟수는 드라이빙 테이블의 데이터 개수와 비례하므로 행 수가 적은 테이블을 드라이빙 테이블로 결정해야 함.
- 두 테이블의 조인 키에 드리븐 테이블의 인덱스가 포함되어 있어야 함.
- hash join : 드라이빙 테이블의 행에 대한 해시 값을 만들고, 드리븐 테이블을 읽으며 해시 값에 일치하는 행을 연결.
구분 | 조인방식 | 조인키 | Table A(Driving) index | Table B(Driven) index |
---|---|---|---|---|
협력사 조건 없는 쿼리 | nested loops | A.배차번호=B.운임번호 | A_Idx05(운송일자) | B_PK(운임번호) |
협력사 조건 있는 쿼리 | hash join | A.배차번호=B.운임번호 | A_Idx05(운송일자) | B_Idx05(거래처코드,작업부서,오더구분) |
협력사 조건이 없는 쿼리 : nl방식으로 조인
협력사 조건이 있는 쿼리 : hash join방식으로 조인
결론
기존 쿼리
WHERE CUST_CD = :CUST_CD.
튜닝 쿼리
WHERE SUBSTR(CUST_CD,1,10) = :CUST_CD
plan 읽는 법
cardinality
: 해당 열에 대한 테이블에 고유한 값의 개수. 0일 경우 NULLcost
: CPU 점유, DISK I/O, 수행시간 등을 종합적으로 판단한 예상 지수
- DB에 따라서 통계정보를 수집하지 않는 경우가 있으므로 튜닝 근거로 판단하기 어렵다
last_cr_buffer_gets
: 읽어온 블록 갯수
- 메모리에 블록이 있을 경우 갯수가 줄어들 수 있으므로 튜닝 근거로 판단하기 어렵다
last_elapsed_time
: 경과시간
- 튜닝 근거가 되는 핵심 요소이다
기존의 쿼리와 튜닝한 쿼리의 AUTOTRACE를 비교해보면 다음과 같다.
7 -> 1,112
)51,968 -> 116,638
)1,707,141-> 1,277,872
)구분 | 소요시간 | 행 수 | 카디널리티(cardinality) | 비용(cost) | 읽어온블록수(last_cr_buffer_gets) | 경과시간(last_elapsed_time) |
---|---|---|---|---|---|---|
기존쿼리(hash) | 16sec | 679행 | 2 | 7 | 51,968 | 1,707,141 |
튜닝쿼리(nl) | 7sec | 679행 | 615 | 1,122 | 116,638 | 1,277,872 |
7 -> 1,112
)480,054 -> 246,767
)331,123,384-> 3,669,925
)구분 | 소요시간 | 행 수 | 카디널리티(cardinality) | 비용(cost) | 읽어온블록수(last_cr_buffer_gets) | 경과시간(last_elapsed_time) |
---|---|---|---|---|---|---|
기존쿼리(hash) | 309sec | 4,072행 | 2 | 7 | 480,054 | 331,123,384 |
튜닝쿼리(nl) | 3sec | 4,072행 | 615 | 1,122 | 246,767 | 3,669,925 |
서프레싱으로 옵티마이저가 택하는 인덱스를 변경하여 결과적으로 경과시간이 1/100까지 감소했다. 굿!
해당 DB는 통계정보를 자동으로 수집하지 않기 때문에 통계가 매우 오래 되어 COST가 정확하지 않을 것이다. DB에 따라서 통계정보를 수집하지 않는 경우가 있으므로 COST만을 튜닝 근거로 사용하기는 어렵다.
통계 정보 자동수집을 하지 않는 DB가 생각보다 많다. 예를 들어, 자동 수집을 하는 경우 어느 날 특정 통계 정보로 인해 실행계획이 바뀌어버리는 경우가 많다. 그렇게 되면 운영 안정성이 매우 떨어지게 되기 때문이다.
필요한 블록이 이미 메모리에 올려져 있는 경우 경과시간이 적게 걸릴 수 있다. 블록이 메모리에 없는 경우 디스크 I/O 시간이 추가적으로 발생하기 때문에 더 효율적인 쿼리도 일시적으로 경과시간이 오래 걸릴 수 있다.
따라서 항상 비례한다고 할 수 없다.
references