배경 : 스트레스 받으면서 에효 꾸역꾸역 쿼리, 화면단 하고 있는데, 쿼리쪽 처음보는게 튀어나왔다 .. 바로 "STRAIGHT_JOIN" 이게 뭔가 일단 남겨두도록 한다.
내용 :
잘 나와있는 블로그 내용을 참고로 하고 그대로 복사한다 (이분도 책에 있는 내용을 적은듯 하다)
이 내용에 대한 내 의견을 남겨둔다.
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;
==> 기존 소스에서는 1번 방법으로 쓰고 있었음. 근데. 난 2번이 더 나은거 같음. 쿼리 가독성 차원에서. 이게 힌트절인지, 조인인지 구분하기 위해.
조인 순서 조정 기준
주로 다음 기준에 맞게 조인 순서가 결정되지 않는 경우에만 STRAIGHT_JOIN 힌트로 조인 순서를 조정하는 것이 좋다.
💡 여기서 말하는 레코드 건수는 인덱스를 사용할 수 있는 WHERE 절 조건까지 포함해서 그 조건을 만족하는 레코드 건수를 의미한다.
무조건 테이블 전체의 레코드 건수가 아니다.
- 임시 테이블(인라인 뷰 또는 파생된 테이블)과 일반 테이블의 조인
- 일반적으로 임시 테이블을 드라이빙 테이블로 선정하는 것이 좋다.
- 일반 테이블의 조인 칼럼에 인덱스가 없는 경우에는 레코드 건수가 작은 쪽을 먼저 읽도록 드라이빙으로 선택하는 것이 좋다.
- 대부분 옵티마이저가 적절한 조인 순서를 선택하기 때문에, 옵티마이저가 실행 계획을 제대로 수립하지 못해서 심각한 성능 저하가 있는 경우 힌트를 사용하면 된다.
- 임시 테이블끼리 조인
- 임시 테이블(서브쿼리로 파생된 테이블)은 항상 인덱스가 없기 때문에, 어느 테이블을 먼저 드라이빙으로 읽어도 무관하므로 크기가 작은 테이블을 드라이빙으로 선택하는 것이 좋다.
- 일반 테이블끼리 조인
- 양쪽 테이블 모두 조인 칼럼에 인덱스가 있거나, 혹은 없는 경우에는 레코드 건수가 적은 테이블을 드라이빙으로 선택해주는 것이 좋다.
- 그 이외의 경우에는 조인 칼럼에 인덱스가 없는 테이블을 드라이빙으로 선택하는 것이 좋다.
==> 기존 소스에는 어마어마한 테이블를 LEFT JOIN 을 걸어두고 있었다. 원 테이블 10개 + 커스텀 데이터를 노출시켜주려고 커스텀 테이블 만들어서 조인하는형태 3개 , 하 진짜 이런 테이블을 걍 돌리니 분명 엄청 느려서 STRAIGHT_JOIN을 썻구나 했음.
비슷한 역할의 옵티마이저 힌트
STRAIGHT_JOIN 힌트와 비슷한 역할을 하는 옵티마이저 힌트는 다음과 같다.
- JOIN_FIXED_ORDER
- STRAIGHT_JOIN 과 동일한 효과를 낸다.
- 한 번 사용되면 FROM 절의 모든 테이블에 대해 조인 순서가 결정된다.
- JOIN_ORDER
- STRAIGHT_JOIN 과는 달리 일부 테이블의 조인 순서에 대해서만 제안한다.
- JOIN_PREFIX
- STRAIGHT_JOIN 과는 달리 일부 테이블의 조인 순서에 대해서만 제안한다.
- JOIN_SUFFIX
- STRAIGHT_JOIN 과는 달리 일부 테이블의 조인 순서에 대해서만 제안한다.
Reference
참고 서적
참고 블로그
https://velog.io/@p0tat0_chip/%EC%9D%B8%EB%8D%B1%EC%8A%A4-%ED%9E%8C%ED%8A%B8-STRAIGHTJOIN
728x90
'개발 > 05.SQL' 카테고리의 다른 글
[SQL, JOIN] Join 의 AND 조건과 Where 의 AND 조건 차이 (1) | 2024.09.11 |
---|---|
[DBeaver] 엑셀 다운로드 라이브러리 수동설치 방법 (0) | 2024.07.25 |