행위

"Use hash aggregation"의 두 판 사이의 차이

DB CAFE

(USE_HASH_AGGREGATION 힌트)
10번째 줄: 10번째 줄:
 
</source>  
 
</source>  
 
   
 
   
만약 GROUP BY 대상이 되는 레코드 수가 ORDER BY 대상 레코드 수가 훨씬 많다면, 다음과 같이 GROUP BY를 보다 효율적인 HASH GROUP BY로 처리한 후 그룹화된 소수의 레코드에 대해 SORT ORDER BY 오퍼레이션을 수행하는 경우가 더 나을 수도 있다.
+
# 만약 GROUP BY 대상이 되는 레코드 수가 ORDER BY 대상 레코드 수가 훨씬 많다면,  
 +
# 다음과 같이 GROUP BY를 보다 효율적인 HASH GROUP BY로 처리한 후 그룹화된 소수의 레코드에 대해 SORT ORDER BY 오퍼레이션을 수행하는 경우가 더 나을 수도 있다.
 
<source lang=sql>  
 
<source lang=sql>  
 
SCOTT@PROD >  SELECT /*+ USE_HASH_AGGREGATION */ d.dname, COUNT (empno) empcount
 
SCOTT@PROD >  SELECT /*+ USE_HASH_AGGREGATION */ d.dname, COUNT (empno) empcount

2024년 3월 25일 (월) 15:13 판

thumb_up 추천메뉴 바로가기


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
  1. 만약 GROUP BY 대상이 되는 레코드 수가 ORDER BY 대상 레코드 수가 훨씬 많다면,
  2. 다음과 같이 GROUP BY를 보다 효율적인 HASH GROUP BY로 처리한 후 그룹화된 소수의 레코드에 대해 SORT ORDER BY 오퍼레이션을 수행하는 경우가 더 나을 수도 있다.
SCOTT@PROD >   SELECT /*+ USE_HASH_AGGREGATION */ d.dname, COUNT (empno) empcount
  2      FROM dept d, emp e
  3     WHERE d.deptno = e.deptno
  4  GROUP BY d.dname
  5  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를 사용하여 얻을 수 있는 이익보다 훨씬 작다면 적용해볼 수 있다.