본문 바로가기
👩‍💻TIL/DB

[SQL 튜닝] 드라이빙 테이블(DRIVING TABLE)의 개념/결정 규칙

by devuna 2020. 3. 9.
728x90

[SQL 튜닝] 드라이빙 테이블(DRIVING TABLE)의 개념/결정 규칙

💡 먼저, 드라이빙 테이블(DRIVING TABLE)이란?

JOIN시 먼저 액세스 돼서 ACCESS PATH를 주도하는 테이블을 드라이빙테이블이라고 한다.

즉, 조인시 먼저 액세스되는 쪽을 드라이빙 테이블(DRIVING TABLE, OUTER TABLE)이라고 하며,

나중에 액세스 되는 테이블을 드리븐 테이블(DRIVEN TABLE, INNER TABLE)이라고 한다.

 

인덱스(INDEX)의 존재 및 우선순위 혹은 FROM절에서의 TABLE 지정 순서에 영향을 받으며

어느 테이블이 먼저 엑세스되느냐에 따라 속도의 차이가 크게 날 수 있으므로

많은 양의 데이터를 다룰 때, 드라이빙 테이블은 매우 중요하다.

 

예를 들어,

 

조건을 만족하는 5000만 건인 A테이블과

조건을 만족하는 1000건인 B테이블과

조인 시 드라이빙 순서에 따라 속도의 확연한 차이가 있다.

 

5000만 건을 먼저 드라이빙하면

5000만 번을 반복하며 B테이블 탐색하며,

 

1000건인 B가 먼저 드라이빙되면

최대 1000번 A테이블 탐색이 반복이 된다.

 

즉, 작업 대상이 되는 행(rows)의 수가 적은 테이블부터 액세스 되어야 전체 탐색이 줄어든다.


그렇다면 어떤 테이블이 드라이빙 테이블이 되는 것일까?

💡결정 규칙은 다음과 같다.

1. 규칙기반 옵티마이저(Rule-Based Optimizer, RBO)에서는 연산자, 인덱스의 유무, 조건절형태 등 정해진 규칙의 우선순위에 따라 실행계획을 생성한다.

 

- 인덱스를 이용한 액세스 방식이 전체 테이블 액세스 방식보다 우선순위가 높음

- 조인 칼럼에 대한 인덱스가 양쪽 테이블에 모두 존재할 때, 우선순위가 높은 테이블을 선택

- 조인 칼럼에만 인덱스가 존재하는 경우에는 인덱스가 없는 테이블을 먼저 선택하여 조인 수행

- 만약 조인 테이블의 우선순위가 동일하지않다면, FROM 절에 나열된 테이블의 역순으로 수행

(참고 역사가 오래된 Oracle은 RBO에서 출발하였으나 다른 상용 RDBMS는 탄생 초기부터 CBO를 채택하였으며, 

Oracle도 10g 버전부터 RBO에 대한 지원을 중단)

 

2. 비용기반 옵티마이저(Cost-Based Optimizer, CBO)는 규칙의 우선순위가 아닌 쿼리를 수행하는데 소요되는 예상 비용을 바탕으로 실행계획을 생성한다. 통계정보, DBMS 설정정보, DBMS 버전 등의 차이로 인해 똑같은 SQL문이라도 서로 다른 실행계획이 생성될 수 있다.

SELECT * 
FROM employees e, dept_emp de
WHERE e.emp_no=de.emp_no;

이 두 테이블의 조인 쿼리에서 emp_no 칼럼과 dept_emp 테이블의 emp_no 칼럼에

각각 인덱스가 있을 때와 없을 때의 조인순서를 비교해 보면 아래와 같다. 

 

1 ) 두 칼럼 모두 각각 인덱스가 있는 경우

옵티마이저의 판단으로 각 테이블의 통계 정보에 있는 레코드 건수에 따라 employees 가 드라이빙 테이블이 될 수도 있고, dept_emp 테이블이 드라이빙 테이블이 될 수도 있다. 

 

2) dept_emp.emp_no 에만 인덱스가 있는 경우 

employees 테이블의 반복된 풀 스캔을 막기 위해 employees 테이블을 드라이빙 테이블로 선택하고 인덱스가 있는 dept_emp 테이블을 드리븐 테이블로 조인을 수행하도록 실행 계획을 수립한다.

 

3) employees.emp_no에만 인덱스가 있는 경우 

dept_emp 테이블이 드리븐 테이블로 선택된다면 employees 테이블의 레코드 건수만큼 dept_emp 테이블을 풀 스캔해야만 "e.emp_no = de.emp_no" 조건에 일치하는 레코드를 찾을 수 있다. 그래서 옵티마이저는 항상 dept_emp 테이블을 드라이빙 테이블로, employees 테이블을 드리븐 테이블로 선택하게 된다. 

 

4) 두 칼럼 모두 인덱스가 없는 경우

어느 테이블을 드라이빙으로 선택하더라도 드리븐 테이블의 풀 스캔은 발생하기 때문에 스캔되는 레코드 수에 따라 옵티마이저가 적절히 드라이빙 테이블을 선택하게 된다. 조인이 수행될때 양쪽 테이블의 칼럼에 모두 인덱스가 없을 때만 드리븐 테이블을 풀스캔한다. 나머지 경우에는 드라이빙 테이블을 풀 테이블 스캔을 사용할 수는 있어도 드리븐 테이블을 풀 테이블 스캔으로 접근하는 실행 계획은 옵티마이저가 거의 만들어내지 않는다.



참고 Real MySQL

728x90

댓글