개요
오라클에서 조인의 방법은 총 3가지가 있습니다. nested loop join, hash join, merge join 중에서 hash join을 알아보겠습니다.
hash join
hash join은 선행 테이블을 해쉬 테이블로 설정하여 ROWID 대신, 해쉬값을 사용해서 대용량 데이터를 빠르게 처리하기 위한 방법입니다.
nested loop join는 대용량 테이블을 조회할 때 적합하지 않습니다. for문 형식으로 계속 반복조회하기 때문입니다.
nested loop join는 ROWID를 찾아서 다른 테이블과 조인했습니다. hash join은 선행 테이블을 해쉬 테이블이라 하며, 해쉬값을 저장하고 있으며, 오라클의 PGA에 저장됩니다. ROWID를 쓰지 않고 새로운 해쉬값을 할당받아 저장되므로, 다른 테이블과 조인할 시, 해쉬 함수를 이용해 조인 여부를 판단합니다.
nested loop join이 행이 작은 테이블을 선행 테이블로 주었는데, hash join도 마찬가지로 행이 작은 테이블을 해쉬 테이블로 설정하고 연결 할 테이블을 PROB 테이블로 설정합니다.
만약 해쉬 테이블에 너무 데이터가 큰 테이블이 올라간다면, 모든 데이터가 PGA에 올라가지 못하고, temp disk를 사용해서 데이터를 올렸다 내렸다를 반복합니다. 이는 오히려 버퍼를 너무 많이 읽는 성능 저하를 유발합니다.
3개 이상 테이블에서 조인하기
일반적으로 데이터가 작은 테이블을 해쉬 테이블로 만들어야 합니다. 그런데 여러 테이블을 조인하다보면, 오라클 옵티마이저가 매 순간 데이터가 작은 테이블을 해쉬테이블로 만드는 것이 아닙니다. 단순히 해쉬 조인했을 때의 결과를 보겠습니다.
PRODUCTS 100 에서 1개의 행만 조회됨에도 불구하고, 해쉬테이블이 되지 못했습니다. 이 테이블을 해쉬 테이블로 강제로 설정해야 합니다.
이 때 swap_join_inputs 를 사용합니다.
강제로 PRODUCTS 100을 해쉬 테이블로 설정하여 메모리 사용을 절약 할 수 있습니다.
해당 힌트의 의미는 products100 -> slales100 -> times100 순서로 조인을 하는데, products100과 sales100을 해쉬조인하고, products 테이블을 해쉬 테이블로 합니다. 그리고 그 결과로 times100 테이블과 해쉬조인을 하는데, times 테이블을 해쉬테이블로 합니다.
'학습 > DB' 카테고리의 다른 글
UNION을 사용한 쓸데없이 긴 표현 (0) | 2023.04.01 |
---|---|
sort merge join (0) | 2022.10.10 |
인덱스 스캔 7가지 종류 (0) | 2022.10.08 |
Connection Pool & DataSource (0) | 2022.09.02 |
JDBC 의 역사 (0) | 2022.09.01 |