grit.log
로그인
grit.log
로그인
JOIN과 성능
K
·
2022년 6월 14일
팔로우
0
SQL BOOSTER
0
SQL BOOSTER
목록 보기
7/12
1. 조인의 내부적인 처리 방식
1.1 조인의 3가지 처리 방식
조인방법 : 이너조인, 아우터 조인, 카테시안 조인
NESTED LOOPS JOIN
MERGE JOIN
HASH JOIN
3가지 방식과 조인방법을 혼합하여 사용가능
1.2 NESTED LOOP JOIN
간단하게 NL조인이라 부른다.
중첩 반복문형태 (중첩 FOR문)
USE_NL힌트사용
NL후행테이블의 인덱스는 매우중요, 필요한부분에 인덱스를 정확히만들어준다면 가장 적은 비용으로 빠르게 결과를 얻을수있다.
많은양의 데이터를 조인하기에는 한계가있는 조인
1.3 MERGE JOIN
두 데이터 집합을 연결조건값으로 정렬한 후 조인을 처리하는 방식
USE_MERGE힌트사용
Operation - SORT JOIN단계는 자신의 자식단계의 결과를 조인하기위해 정렬하는 작업
소트(정렬) 작업을 어떻게 줄이느냐가 성능향상의 주요 포인트
1.4 HASH JOIN
조인성능문제 대부분이 해시조인으로 해결되는경우가 많음
다른방식보다 더많은 CPU와 메모리자원 사용 > NL조인으로 충분히 해결할수있는문제를 모두 해시조인으로 처리하면 시스템 전반적으로 성능문제 발생할수있음.
USE_HASH힌트사용
HASH 조인 처리과정 간소화 이미지
NL처럼 후행집합 반복접근 비효율 없고, 머지조인처럼 정렬작업을 수행하지도않는다.
다만 고비용 해시함수와 메모리 일부인 해시영역을 사용하는 비용이 추가투입.
NL, 머지조인 단점을 커버하지만, 시스템 자원 소모하는 단점.
2. NL조인과 성능
NL조인은 후행테이블쪽 조인조건 컬럼에 인덱스가 필수 > 없다면 후행테이블 풀스캔하게됨
조인컬럼에 인덱스가없다면 인라인뷰를 통해 건수를 줄여주는게 좋다.
Predicate Information에서 access처리되는지 확인 필요
쿼리변형(Query Transformation) : 조건에 따라 SQL이 자동변형되는경우도있음.
SQL의 변형이 실행결과에 전혀 영향이 없다.
선행집함에따라 변형이 성능이 더 좋은경우.
조인 횟수를 줄이는 시도
선행집합변경 : 건수가 적은 테이블을 선행테이블로
A테이블:60건 B테이블:12000건일경우
B - A 조인은 A에 12000번접근
A - B조인은 B에 60번만접근
후행집합 접근횟수를 줄이려면 선행집합 건수가 작아야한다.
COUNT를통해 건수확인후 조인을 구성해보자.
여러테이블 조인
건수확인, 조인방법 결정, 인덱스 유무 체크
특정 SQL 성능 개선을 위한 과도한 튜닝(인덱스 남발등)은 오히려 시스템 전반적 성능에 문제가생길수 있다.
선행집합이 항상 작은쪽이어야 할 필요는없다.
후행집합에서 인덱스로 읽을 데이터가 너무많을 경우는 FULL SCAN하여 선행으로 옮기는것이 더 효율적일 수 있다.
3. MERGE조인과 성능
3.1 대량의 데이터 처리
MERGE 조인은 대량의 데이터 조인시 적합
3.2 필요한 인덱스
조인대상 테이블 각가의 WHERE조건에 각각의 인덱스를 구성해주면된다.
각인덱스는 TABLE ACCESS FULL보다 좋은 성능이라야한다.
정렬작업(SORT JOIN)을 제거할 수 있는 인덱스를 구성하는것도 좋은 전략
4. HASH조인과 성능
4.1 대량의 데이터 처리
NL, 머지조인의 단점해결 BUT 시스템 자원소모가큼
빌드입력(선행집합)의 선택이 매우 중요
검증입력(Probe-Input)은 후행입력 : 후행집합에 해시함수를 적용해 빌드입력과 비교해 조인을 처리하는 과정
해시조인은 빌드입력이 데이터가 적을수록 성능에 유리
빌드입력의 데이터가 너무많아 해시영역에 올릴 수 없으면 임시공간을 사용하게되며 이로 인해 성능저하 발생.
소량의 데이터 조인에도 매우 유용
어떻게조인할것인가
조인순서 인덱스를 다양하게바꿔보고 NL, 머지, 해시등을 다양하게 구사해본다.
K
늙어가면서 기억을 남기는 개발자
팔로우
이전 포스트
단일인덱스 & 복합인덱스
다음 포스트
OLTP기술 (트랜잭션,LOCK)
0개의 댓글
댓글 작성