실행계획 SQL 연산(HASH JOIN)
Hash Join은 테이블의 조인 시 특정 테이블 하나(크기가 작은 테이블)를 메모리로 로드 후 Hash 기법을 이용하여 조건에 맞는 데이터를 추출하는 로우(ROW) 연산 또는 집합(SET) 연산 입니다.
일반적으로 Hash Join이 Merge Join 보다 성능이 우수하므로 힌트(USE_HASH)를 이용하여 인위적으로 해시 조인이 일어나도록 하는 것이 유리 합니다.
SQL문 사용시 인위적으로 Hash Join이 일어나게 하기 위해서는 USE_HASH 라는 힌트를 사용하면 되는데 힌트를 사용하지 않더라도 Join시 두 테이블 중 한 테이블이 상당히 작아 메모리에 로드 될만한 공간이 있다면 Hsah Join이 일어나는 실행 계획을 만들어 낼 수 있습니다.
SQL> SELECT /*+ ORDERED USE_HASH(DEPT, EMP) */
EMP.ENAME,
EMP.SAL,
DEPT.DNAME
FROM DEPT, EMP
WHERE DEPT.DEPTNO = EMP.DEPTNO;
Execution Plan
-----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE(Cost=5 Card=80 Bytes=8888)
1 0 HASH JOIN(Cost=5 Card=80 Bytes=8888)
2 1 TABLE ACCESS (FULL) OF ‘DEPT’ (Cost=1 Card=67 Bytes=3456)
3 1 TABLE ACCESS (FULL) OF ‘EMP’ (Cost=1 Card=90 Bytes=8756)
위 실행계획에서 DEPT 테이블이 위쪽에 위치하는데 보통 작은 테이블이 위에 위치할 때 좋은 성능을 낼 수 있습니다. 즉 DEPT 테이블이 메모리에 로드 되면 Oracle은 해싱 함수를 이용하여 EMP 테이블의 ROW들을 메모리에 로드 되어 있는 값과 비교하여 원하는 데이터를 추출 하며 이때 FROM절 뒤의 테이블 순서와 USE_HASH 힌트에 나오는 테이블의 순서는 같아야 합니다.
일반적으로 USE_HASH 힌트는 ORDERED 힌트와 같이 사용되는데 이때는 USE_HASH 인수로 두번째 테이블명(Alias 명)만을 적어도 됩니다. 즉 아래처럼 말입니다.
/*+ ORDERED USE_HASH(DEPT) */
Hash Join의 성능에 영향을 주는 파라미터는 HASH_AREA_SIZE와 HAHS_MULTIBLOCK_IO_COUNT가 있으며 첫번째 파라미터는 해시 조인 시 해시 테이블을 생성하기 위해 사용 가능한 메모리의 사이즈 이며 두번째 파라미터는 한번의 I/O로 해시 조인 시 쓰거나 읽을 수 있는 블록의 수입니다.(9i 이상에서는 HASH_MULTIBLOCK_IO_COUNT 파라미터는 더 이상 사용되지 않습니다.)
Hash Join은 테이블의 조인 시 특정 테이블 하나(크기가 작은 테이블)를 메모리로 로드 후 Hash 기법을 이용하여 조건에 맞는 데이터를 추출하는 로우(ROW) 연산 또는 집합(SET) 연산 입니다.
일반적으로 Hash Join이 Merge Join 보다 성능이 우수하므로 힌트(USE_HASH)를 이용하여 인위적으로 해시 조인이 일어나도록 하는 것이 유리 합니다.
SQL문 사용시 인위적으로 Hash Join이 일어나게 하기 위해서는 USE_HASH 라는 힌트를 사용하면 되는데 힌트를 사용하지 않더라도 Join시 두 테이블 중 한 테이블이 상당히 작아 메모리에 로드 될만한 공간이 있다면 Hsah Join이 일어나는 실행 계획을 만들어 낼 수 있습니다.
SQL> SELECT /*+ ORDERED USE_HASH(DEPT, EMP) */
EMP.ENAME,
EMP.SAL,
DEPT.DNAME
FROM DEPT, EMP
WHERE DEPT.DEPTNO = EMP.DEPTNO;
Execution Plan
-----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE(Cost=5 Card=80 Bytes=8888)
1 0 HASH JOIN(Cost=5 Card=80 Bytes=8888)
2 1 TABLE ACCESS (FULL) OF ‘DEPT’ (Cost=1 Card=67 Bytes=3456)
3 1 TABLE ACCESS (FULL) OF ‘EMP’ (Cost=1 Card=90 Bytes=8756)
위 실행계획에서 DEPT 테이블이 위쪽에 위치하는데 보통 작은 테이블이 위에 위치할 때 좋은 성능을 낼 수 있습니다. 즉 DEPT 테이블이 메모리에 로드 되면 Oracle은 해싱 함수를 이용하여 EMP 테이블의 ROW들을 메모리에 로드 되어 있는 값과 비교하여 원하는 데이터를 추출 하며 이때 FROM절 뒤의 테이블 순서와 USE_HASH 힌트에 나오는 테이블의 순서는 같아야 합니다.
일반적으로 USE_HASH 힌트는 ORDERED 힌트와 같이 사용되는데 이때는 USE_HASH 인수로 두번째 테이블명(Alias 명)만을 적어도 됩니다. 즉 아래처럼 말입니다.
/*+ ORDERED USE_HASH(DEPT) */
Hash Join의 성능에 영향을 주는 파라미터는 HASH_AREA_SIZE와 HAHS_MULTIBLOCK_IO_COUNT가 있으며 첫번째 파라미터는 해시 조인 시 해시 테이블을 생성하기 위해 사용 가능한 메모리의 사이즈 이며 두번째 파라미터는 한번의 I/O로 해시 조인 시 쓰거나 읽을 수 있는 블록의 수입니다.(9i 이상에서는 HASH_MULTIBLOCK_IO_COUNT 파라미터는 더 이상 사용되지 않습니다.)
오라클자바커뮤니티교육센터, 개발자전문교육, 개인80%환급
www.oraclejavacommunity.com
평일주간(9:30~18:10) 개강
(6/30)[기업100%환급]PL/SQL,ORACLE HINT,TUNING[개강확정]
(6/30)[기업100%환급]안드로이드개발자과정[개강확정]
(6/30)[기업100%환급]SQL기초에서 Schema Object까지[개강확정]
(7/07)[기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍
(7/07)[기업100%환급]Spring ,MyBatis,Hibernate실무과정[개강확정]
(7/07)[기업100%환급]자바기초에서 JDBC, Servlet/JSP까지
(7/07)[채용예정교육]오라클자바개발잘하는신입뽑기프로젝트,교육전취업확정
평일야간(19:00~21:50) 개강
(6/26)SQL초보에서실전전문가까지[개강확정]
(7/01)안드로이드개발자과정[개강확정]
(7/01)닷넷(C#,Network,ADO.NET,ASP.NET)마스터과정
(7/02)Spring3.X, MyBatis, Hibernate실무과정[개강확정]
(7/02)자바웹(JSP,Spring,MyBatis,XPlatform)프로젝트과정
(7/02)JAVA,Network&WEB&Framework(자바기초에서웹스프링까지)
(7/03)웹퍼블리싱 마스터
(7/15)MyBatis3.X, Hibernate4.X ORM실무과정
(7/22)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
주말(10:00~17:50) 개강
(6/28)Spring3.X, MyBatis, Hibernate실무과정[개강확정]
(6/28)안드로이드개발자과정
(6/29)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지[개강확정]
(7/05)SQL초보에서 Schema Object까지
(7/12)자바웹(JSP,Spring,MyBatis,XPlatform)프로젝트과정
(7/12)MyBatis3.X, Hibernate4.X ORM실무과정
(7/12)개발자를위한PLSQL,SQL튜닝,힌트
(7/12)실무예제로 배워보는 jQuery(개발자/디자이너를위한)
(7/13)C#,ASP.NET마스터
주말저녁(18:30~22:20) 개강
(6/28)JAVA,Network&WEB&Framework
(6/28)SQL기초에서실무까지
www.oraclejavacommunity.com
평일주간(9:30~18:10) 개강
(6/30)[기업100%환급]PL/SQL,ORACLE HINT,TUNING[개강확정]
(6/30)[기업100%환급]안드로이드개발자과정[개강확정]
(6/30)[기업100%환급]SQL기초에서 Schema Object까지[개강확정]
(7/07)[기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍
(7/07)[기업100%환급]Spring ,MyBatis,Hibernate실무과정[개강확정]
(7/07)[기업100%환급]자바기초에서 JDBC, Servlet/JSP까지
(7/07)[채용예정교육]오라클자바개발잘하는신입뽑기프로젝트,교육전취업확정
평일야간(19:00~21:50) 개강
(6/26)SQL초보에서실전전문가까지[개강확정]
(7/01)안드로이드개발자과정[개강확정]
(7/01)닷넷(C#,Network,ADO.NET,ASP.NET)마스터과정
(7/02)Spring3.X, MyBatis, Hibernate실무과정[개강확정]
(7/02)자바웹(JSP,Spring,MyBatis,XPlatform)프로젝트과정
(7/02)JAVA,Network&WEB&Framework(자바기초에서웹스프링까지)
(7/03)웹퍼블리싱 마스터
(7/15)MyBatis3.X, Hibernate4.X ORM실무과정
(7/22)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
주말(10:00~17:50) 개강
(6/28)Spring3.X, MyBatis, Hibernate실무과정[개강확정]
(6/28)안드로이드개발자과정
(6/29)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지[개강확정]
(7/05)SQL초보에서 Schema Object까지
(7/12)자바웹(JSP,Spring,MyBatis,XPlatform)프로젝트과정
(7/12)MyBatis3.X, Hibernate4.X ORM실무과정
(7/12)개발자를위한PLSQL,SQL튜닝,힌트
(7/12)실무예제로 배워보는 jQuery(개발자/디자이너를위한)
(7/13)C#,ASP.NET마스터
주말저녁(18:30~22:20) 개강
(6/28)JAVA,Network&WEB&Framework
(6/28)SQL기초에서실무까지
댓글 없음:
댓글 쓰기