MySQL(15)
오늘 배운 것
SELECT *
FROM employees e IGNORE INDEX(PRIMARY, ix_hiredate)
INNER JOIN dept_emp de IGNORE INDEX(ix_empno_fromdate, ix_fromdate)
ON de.emp_no=e.emp_no AND de.from_date=hire_date
HJ는 빌드단계와 프로브 단계로 나뉜다.
-
빌드단계 : 조인 대상 테이블 중에서 레코드 건수가 적어서 해시 테이블로 만들기에 요잉한 테이블을 골라서 메모리에 해시 테이블을 빌드 하는 작업을 수행한다. 빌드 단계에서 해시테이블을 만들때 사용되는 원본 테이블을 빌드 테이블 이라고도 한다.
-
프로브단계 : 나머지 테이블의 레코드를 읽어서 해시테이블의 일치 레코드를 찾는 과정. 읽는 나머지 테이블을 프로브 테이블이라고도 한다.
근데 일반적인 EXPLAIN 실행계획으론 어느 테이블이 빌드고 프로브 테이블인지 알기 어렵다. EXPLAIN FORMAT=TREE 또는 EXPLAIN ANALYZE 명령어로 쉽게 구분 할 수 있다.
하여튼 실행계획에서 보면 최하단의 가장 들여쓰기 된 안쪽의 dept_emp 테이블이 빌드 테이블로 선정되었다.

옵티마이저는 빌드 테이블인 dept_emp를 읽어서 메모리 해시테이블을 만들고, employees프로브 테이블을 스캔하면서 메모리에 생성된 해시테이블에서 결과를 찾아서 반환한다.
해시테이블을 메모리에 저장할때 조인버퍼를 사용하는데, 조인버퍼 기본크기가 256KB다. 그래서 메모리 해시테이블이 이거보다 커지면,
빌드와 프로브 테이블을 적당한 크기(청크 하나가 조인버퍼보다 작도록)의 청크로 분리한 다음, 청크별로 위와 동일 방식으로 해시 조인을 처리한다.
해시조인에서 메모리 해시 테이블이 조인버퍼보다 커지면 빌드와 프로브 테이블을 적당한 크기의 청크로 분리하는데, 이때 적당한 크기가 몇이고 왜 그럴까
적당한 크기란 조인버퍼보다는 작은 크기. 동일방식으로 처리하기위해서.
