TIL

9.3(5) 컨디션 팬아웃과 파생 테이블 머지

컨디션 팬아웃(condition_fanout_filter)

SELECT * 
FROM employees e
	INNER JOIN salaries s ON s.emp_no=e.emp_no
WHERE e.first_name='Matt'
	AND e.hire_Date BETWEEN '1995-11-21' AND 1986-11-21';

condition_fanout_filter=off

id table type key rows filtered Extra
1 e ref ix_firstname 233 100.00 Using where
1 s ref PRIMARY 10 100.00 NULL
  1. employees 테이블에서 ix_firstname 인덱스로 조건에 맞는 233건 레코드를 검색
  2. 233건 중 hire_date 조건에 맞는 레코드를 필터링하는데 이 실행 계획에서는 filered 칼럼이 100인 것으로 보아 233건 모두 만족할 것으로 예측했다.
  3. 233건에 대해 salaries 테이블의 프라이머리 키를 이용해 slalaries 테이블의 레코드를 읽는데 옵티마이저는 employees 테이블 레코드 한 건당 salaries 테이블 레코드 10건이 일치할 것으로 예상했다.

condition_fanout_filter=on

id table type key rows filtered Extra
1 e ref ix_firstname 233 23.20 Using where
1 s ref PRIMARY 10 100.00 NULL

파생 테이블 머지(derived_merge)

SELECT * FROM (
	SELECT * FROM employees WHERE first_name='Matt'
) derived_table
WHERE derived_table.hire_date='1996-04-03';
id select_type table type key
1 PRIMARY ref
2 DERIVED employees ref ix_firstname
id select_type table type key
1 SIMPLE employees index_merge ix_hiredate, ix_firstname