Use hash aggregation
DB CAFE
thumb_up 추천메뉴 바로가기
- DBA { Oracle DBA 명령어 > DBA 초급 과정 > DBA 고급 과정 }
- 튜닝 { 오라클 튜닝 목록 }
- 모델링 { 데이터 모델링 가이드 }
USE_HASH_AGGREGATION 힌트[편집]
- NO_USE_HASH_AGGREGATION 힌트
SCOTT@PROD >
select name, version
from v$sql_hint
where name like '%USE_HASH_AGGREGATION%';
NAME VERSION
---------------------------------------------------------------- -------------------------
USE_HASH_AGGREGATION 10.2.0.1
NO_USE_HASH_AGGREGATION 10.2.0.1
- 만약 GROUP BY 대상이 되는 레코드 수가 ORDER BY 대상 레코드 수가 훨씬 많다면,
- 다음과 같이 GROUP BY를 보다 효율적인 HASH GROUP BY로 처리한 후 그룹화된 소수의 레코드에 대해 SORT ORDER BY 오퍼레이션을 수행하는 경우가 더 나을 수도 있다.
SCOTT@PROD >
SELECT /*+ USE_HASH_AGGREGATION */
d.dname, COUNT (empno) empcount
FROM dept d, emp e
WHERE d.deptno = e.deptno
GROUP BY d.dname
ORDER BY d.dname;
DNAME EMPCOUNT
-------------- ----------
ACCOUNTING 3
RESEARCH 5
SALES 6
Elapsed: 00:00:00.06
Execution Plan
----------------------------------------------------------
Plan hash value: 1778488252
------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 64 | 7 (29)| 00:00:01 |
| 1 | SORT ORDER BY | | 4 | 64 | 7 (29)| 00:00:01 |
| 2 | HASH GROUP BY | | 4 | 64 | 7 (29)| 00:00:01 |
| 3 | MERGE JOIN | | 14 | 224 | 6 (17)| 00:00:01 |
| 4 | TABLE ACCESS BY INDEX ROWID| DEPT | 4 | 52 | 2 (0)| 00:00:01 |
| 5 | INDEX FULL SCAN | PK_DEPT | 4 | | 1 (0)| 00:00:01 |
|* 6 | SORT JOIN | | 14 | 42 | 4 (25)| 00:00:01 |
| 7 | TABLE ACCESS FULL | EMP | 14 | 42 | 3 (0)| 00:00:01 |
------------------------------------------------------------------------------------------
위의 방법은 SORT ORDER BY를 사용했을 때 오버헤드가 HASH GROUP BY를 사용하여 얻을 수 있는 이익보다 훨씬 작다면 적용해볼 수 있다.