DATOR


HASH JOIN을 위한 연결고리 강제로 생성하기

튜닝,이행,작업을 하다가 담당자는 HASH JOIN으로 하고 싶은데
연결고리가 EQUAL 이 아닌 BETWEEN,LIKE 인 경우에 HASH JOIN을 강제로 하는 방법이다.

예를 들어 아래와 같은 SQL을 HASH JOIN으로 강제로 HINT을 줘서 처리해 보자.

 

SELECT /*+ USE_HASH(A B) */
        *
  FROM SCOTT.EMP A,
       SCOTT.DEPT B
WHERE A.DEPTNO LIKE '%'||B.DEPTNO||'%'        

 

----------------------------------------------------------------------------------------------
| Id  | Operation          | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |      1 |        |     14 |00:00:00.03 |      37 |      6 |
|   1 |  NESTED LOOPS      |      |      1 |      3 |     14 |00:00:00.03 |      37 |      6 |            ====> HASH JOIN 절대로 안됨.
|   2 |   TABLE ACCESS FULL| DEPT |      1 |      4 |      4 |00:00:00.03 |       8 |      6 |
|*  3 |   TABLE ACCESS FULL| EMP  |      4 |      1 |     14 |00:00:00.01 |      29 |      0 |
----------------------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):
---------------------------------------------------
 
   3 - filter(TO_CHAR("A"."DEPTNO") LIKE '%'||TO_CHAR("B"."DEPTNO")||'%')
 

왜 HASH JOIN이 안될까? 너무 간단한 이유이지만 HASH JOIN은 당연 연결고리가 EQUAL 조건이 와야 한다.

그러면 아래의 SQL에서 두집합의 강제로  EQUAL 조건을 생성해 보자

 

SELECT /*+ gather_plan_statistics USE_HASH(A B) */
        *
  FROM SCOTT.EMP A,
       SCOTT.DEPT B
WHERE A.DEPTNO LIKE '%'||B.DEPTNO||'%'      
  AND LENGTHB(A.ROWID) = LENGTHB(B.ROWID)   
 ----- 강제로 EQUAL 연결고리 생성(항상 TRUE의 연결고리 생성해야 함)


 

----------------------------------------------------------------------------------------------------------------
| Id  | Operation          | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |      1 |        |     14 |00:00:00.05 |      15 |       |       |          |
|*  1 |  HASH JOIN         |      |      1 |      1 |     14 |00:00:00.05 |      15 |   774K|   774K|  329K (0)|    ------HASH JOIN으로 풀림
|   2 |   TABLE ACCESS FULL| DEPT |      1 |      4 |      4 |00:00:00.01 |       7 |       |       |          |
|   3 |   TABLE ACCESS FULL| EMP  |      1 |     14 |     14 |00:00:00.01 |       8 |       |       |          |
----------------------------------------------------------------------------------------------------------------

 

 

Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - access(LENGTHB(ROWIDTOCHAR("A".ROWID))=LENGTHB(ROWIDTOCHAR("B".ROWID)))
       filter(TO_CHAR("A"."DEPTNO") LIKE '%'||TO_CHAR("B"."DEPTNO")||'%')
 

AND LENGTHB(A.ROWID) = LENGTHB(B.ROWID)  --- 강제의 EQUAL 연결 고리 생성

 

도움이 되시기를 바랍니다.

 

Tag

Leave Comments