인덱스 힌트: STRAIGHT_JOIN

공부하는 감자·2024년 4월 4일
0

MySQL

목록 보기
41/74
post-thumbnail

STRAIGHT_JOIN

  • STRAIGHT_JOIN 는 옵티마이저 힌트인 동시에 조인 키워드이기도 하다.
  • 여러 개의 테이블이 조인될 때, 옵티마이저가 그때그때 각 테이블의 통계 정보와 쿼리의 조건을 기반으로 가장 최적이라고 판단되는 순서로 조인한다.
    • 어느 테이블이 드라이빙 테이블이 되고, 어느 테이블이 드리븐 테이블이 될 지 알 수 없다.
    • 일반적으로 조인을 하기 위한 칼럼들의 인덱스 여부로 조인의 순서가 결정된다.
    • 조인 칼럼의 인덱스에 아무런 문제가 없는 경우(WHERE 조건이 있는 경우 WHERE 조건을 만족하는) 레코드가 적은 테이블을 드라이빙으로 선택한다.
  • STRAIGHT_JOIN 힌트는 SELECT, UPDATE, DELETE 쿼리에서 여러 개의 테이블이 조인되는 경우 조인 순서를 고정하는 역할을 한다.
    • 쿼리의 조인 순서를 변경하려는 경우 사용할 수 있다.
    • 옵티마이저가 FROM 절에 명시된 테이블의 순서대로 조인을 수행하도록 유도한다.
  • 한 번 사용되면 FROM 절의 모든 테이블에 대해 조인 순서가 결정되는 효과가 있다.
  • SELECT 키워드 바로 뒤에 STRAIGHT_JOIN 키워드가 사용된다.
    -- 사용 방법1
    SELECT STRAIGHT_JOIN
    	e.first_name, e.last_name, d.dept_name
    FROM employees e, dept_emp de, departments d
    WHERE e.emp_no = de.emp_no
    	AND d.dept_no = de.dept_no;
    	
    -- 사용 방법2
    SELECT /*! STRAIGHT_JOIN */ 
    	e.first_name, e.last_name, d.dept_name
    FROM employees e, dept_emp de, departments d
    WHERE e.emp_no = de.emp_no
    	AND d.dept_no = de.dept_no;

조인 순서 조정 기준

주로 다음 기준에 맞게 조인 순서가 결정되지 않는 경우에만 STRAIGHT_JOIN 힌트로 조인 순서를 조정하는 것이 좋다.

💡 여기서 말하는 레코드 건수는 인덱스를 사용할 수 있는 WHERE 절 조건까지 포함해서 그 조건을 만족하는 레코드 건수를 의미한다.
무조건 테이블 전체의 레코드 건수가 아니다.

  • 임시 테이블(인라인 뷰 또는 파생된 테이블)과 일반 테이블의 조인
    • 일반적으로 임시 테이블을 드라이빙 테이블로 선정하는 것이 좋다.
    • 일반 테이블의 조인 칼럼에 인덱스가 없는 경우에는 레코드 건수가 작은 쪽을 먼저 읽도록 드라이빙으로 선택하는 것이 좋다.
    • 대부분 옵티마이저가 적절한 조인 순서를 선택하기 때문에, 옵티마이저가 실행 계획을 제대로 수립하지 못해서 심각한 성능 저하가 있는 경우 힌트를 사용하면 된다.
  • 임시 테이블끼리 조인
    • 임시 테이블(서브쿼리로 파생된 테이블)은 항상 인덱스가 없기 때문에, 어느 테이블을 먼저 드라이빙으로 읽어도 무관하므로 크기가 작은 테이블을 드라이빙으로 선택하는 것이 좋다.
  • 일반 테이블끼리 조인
    • 양쪽 테이블 모두 조인 칼럼에 인덱스가 있거나, 혹은 없는 경우에는 레코드 건수가 적은 테이블을 드라이빙으로 선택해주는 것이 좋다.
    • 그 이외의 경우에는 조인 칼럼에 인덱스가 없는 테이블을 드라이빙으로 선택하는 것이 좋다.

비슷한 역할의 옵티마이저 힌트

STRAIGHT_JOIN 힌트와 비슷한 역할을 하는 옵티마이저 힌트는 다음과 같다.

  • JOIN_FIXED_ORDER
    • STRAIGHT_JOIN 과 동일한 효과를 낸다.
    • 한 번 사용되면 FROM 절의 모든 테이블에 대해 조인 순서가 결정된다.
  • JOIN_ORDER
    • STRAIGHT_JOIN 과는 달리 일부 테이블의 조인 순서에 대해서만 제안한다.
  • JOIN_PREFIX
    • STRAIGHT_JOIN 과는 달리 일부 테이블의 조인 순서에 대해서만 제안한다.
  • JOIN_SUFFIX
    • STRAIGHT_JOIN 과는 달리 일부 테이블의 조인 순서에 대해서만 제안한다.

Reference

참고 서적

📔 Real MySQL 8.0

profile
책을 읽거나 강의를 들으며 공부한 내용을 정리합니다. 가끔 개발하는데 있었던 이슈도 올립니다.

0개의 댓글