| 항목 | SORT 기반 방식 | HASH 기반 방식 |
|---|---|---|
| 방식 | 데이터를 정렬한 후 연산 수행 | 해시 테이블을 만들어 연산 수행 |
| 속도 | 데이터가 작을 때 유리 | 데이터가 클 때, 메모리가 충분하면 유리 |
| 자원 | TEMP 공간 사용 (디스크 I/O 많음) | PGA 메모리 사용 (메모리 의존적) |
| 사용처 | ORDER BY, DISTINCT, MERGE JOIN, GROUP BY 등 | HASH JOIN, HASH GROUP BY, HASH UNIQUE 등 |
HASH JOIN두 테이블을 조인할 때, 한 쪽 테이블을 메모리에 올려 해시 테이블을 만든 후 다른 쪽 테이블과 매칭.
예:
SELECT * FROM emp e JOIN dept d ON e.deptno = d.deptno;
실행 계획:
| 1 | HASH JOIN |
| 2 | TABLE ACCESS FULL EMP |
| 3 | TABLE ACCESS FULL DEPT |
🔸 대량 데이터를 조인할 때 성능이 좋음.
🔸 인덱스가 없어도 사용 가능.
🔸 작은 테이블을 해시 테이블로 사용 (선행 테이블).
HASH GROUP BYGROUP BY 연산 시 정렬하지 않고, 해시 테이블에 그룹핑.
예:
SELECT deptno, COUNT(*) FROM emp GROUP BY deptno;
실행 계획 (힌트 사용 시):
| 1 | HASH GROUP BY |
| 2 | TABLE ACCESS FULL EMP |
🔸
USE_HASH_AGGREGATION힌트를 사용하면 유도할 수 있음.
🔸 대용량 데이터에서 TEMP 정렬 부담 없이 그룹핑.
HASH UNIQUEDISTINCT 연산 시, 정렬 없이 중복 제거를 위해 해시 테이블을 사용.
예:
SELECT DISTINCT job FROM emp;
실행 계획:
| 1 | HASH UNIQUE |
| 2 | TABLE ACCESS FULL EMP |
🔸
SORT UNIQUE보다 메모리 효율적일 수 있음.
🔸 오라클 옵티마이저가 데이터 양과 통계에 따라 선택.
오라클 옵티마이저는 아래 기준으로 판단합니다:
| 상황 | 선택 경향 |
|---|---|
| 데이터 양 적고, 인덱스가 있음 | SORT MERGE JOIN, SORT GROUP BY |
| 데이터 양 많고, 인덱스 없음 | HASH JOIN, HASH GROUP BY |
정렬이 꼭 필요한 경우 (ORDER BY) | SORT ORDER BY 고정 |
| DISTINCT 처리에 따라 | SORT UNIQUE 또는 HASH UNIQUE |
SELECT /*+ USE_HASH(t1 t2) */ ... FROM t1 JOIN t2 ...
SELECT /*+ USE_MERGE(t1 t2) */ ...
SELECT /*+ USE_HASH_AGGREGATION */ deptno, COUNT(*) FROM emp GROUP BY deptno;
pga_aggregate_target).HASH와 SORT가 왜 선택되었는지 감이 잡히고, 힌트를 통해 어느 정도 조정도 가능합니다.참고)지피티