세미 조인 서브. 쿼리 - Duplicate Weedout 최적화

Ilyoung Hwang·2022년 2월 21일
0
post-thumbnail

Duplicate Weedout 은 세미 조인 서브 쿼리를 일반적인 INNER JOIN 쿼리로 바꿔서 실행하고 마지막에 중복된 레코드를 제거하는 방법으로 처리되는 최적화 알고리즘이다.


아래의 salaries 테이블의 Parimary key 가 (emp_no + from_date) 로 설정되어 있을경우 조회 결과는 중복된 emp_no 가 발생할 수 있다.

SELECT * FROM employee e
WHERE e.emp_no IN (SELECT s.emp_no FROM salaries s WHERE s.salary > 150000)

하지만, 아래의 쿼리엔 GROUP BY 절을 넣어주었는데 결과는 위의 세미 조인 서브쿼리와 동일한 결과를 얻었다.

SELECT e.* FROM employees.employees e , employees.salaries s 
WHERE e.emp_no  = s.emp_no AND s.salary > 150000
GROUP BY e.emp_no ;

실제로 Duplicate Weedout 최적화 알고리즘은 원본 쿼리를 위와 같이 INNER JOIN + GROUP BY 절로 바꿔서 실행하는 것과 동일한 작업으로 쿼리를 처리한다.


Weedout 최적화 알고리즘 처리과정은 다음과 같다.

  1. salaries 테이블의 ix_salary 인덱스를 스캔해서 salary 가 150000 보다 큰 사원을 검색하여 employees 테이블의 조인을 실행
  2. 조인된 결과를 임시 테이블에 저장
  3. 임시 테이블에 저장된 결과에서 emp_no 기준으로 중복 제거
  4. 중복을 제거하고 남은 레코드를 최종적으로 반환

Weedout 최적화 알고리즘은 다음과 같은 제한사항이 있다.

  1. 서브 쿼리가 상관 서브쿼리라 하더라도 사용할 수 있는 최적화이다.
  2. 서브 쿼리가 GROUP BY 나 집합 함수가 사용된 경우에는 사용될 수 없다.
  3. Duplicate Weedout 은 서브 쿼리의 테이블을 조인으로 처리하기 때문에 최적화를 할 수 있는 방법이 많다.

0개의 댓글