[오라클ACCESS경로변경힌트]INDEX_JOIN힌트,인덱스 조인을 유도하는
힌트,ORACLE힌트실습,[자바개발자교육/자바교육/자바강좌/자바교육잘하는곳/자바교육추천/자바실무교육/JAVA/JAVA교육/JAVA학원/JAVA실무교육]
인덱스 조인을 유도하는 힌트로 효과적이기 위해서는 테이블에 만들어진 인덱스가 SELECT문장 리스트에 나타난 컬럼 들을 모두 가져야 한다. 테이블간 조인에 사용되는 것과 무관하게 하나의 테이블에 있는 여러 인덱스를 이용해 테이블 원본데이터 ACCESS없이 결과 집합을 만들 때 사용하는 인덱스 스캔방식 이다.
해시조인을 이용하며 index$_join$_xxx 의 형태로 실행계획에 표시된다.
[예]
SELECT /*+ INDEX_JOIN(e emp_mgr_ix emp_deptno_ix) */ deptno
FROM emp e
WHERE mgr < 7800
AND deptno < 20;
실습을 위한 예제 테이블은 다음 URL을 참조하여 만들자.
http://oraclejavanew.kr/bbs/board.php?bo_table=LecHINT&wr_id=117
MYEMP1 테이블의 인덱스는 PK(empno)외에는 없다.
[실습]
Oracle 11g R2에서의 테스트 결과이다.
Empno PK Unique인덱스외 sal 컬럼으로 B*TREE인덱스 하나 만들자.
select * from user_indexes where table_name = 'MYEMP1' 명령으로 인덱스를 조회해 보자. PK Unique인덱스의 이름은 SYS_C0012349 다.
SQL> desc myemp1;
이름 널? 유형
----------------------------------------- -------- -----------------
EMPNO NOT NULL NUMBER
ENAME VARCHAR2(100)
DEPTNO NUMBER
ADDR VARCHAR2(100)
SAL NUMBER
SUNGBYUL VARCHAR2(1)
SQL> set autotrace traceonly
SQL> set timing on
SQL> create index idx_myemp1_sal on myemp1(sal);
인덱스가 생성되었습니다.
힌트없이 실행하니 전체 테이블을 FULL SCAN 한다.
참고로 MYEMP! 테이블의 데이터 분포는 EMPNO인 경우 1부터 20,000,000까지 유일한 값을 가지고 있고 sal의 경우 0부터 2,999,999까지의 값으로 이루어져 있다. 2000만건이니 sal 값은 대략 6개 정도 중복되어 있다.
SQL> select empno, sal from myemp1 e
2 where e.empno > 17000000
3 and e.sal > 2000000;
1999999 개의 행이 선택되었습니다.
경 과: 00:00:31.50
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1500K| 17M| 40104 (1)| 00:08:02
|* 1 | TABLE ACCESS FULL| MYEMP1 | 1500K| 17M| 40104 (1)| 00:08:02
--------------------------------------------------------------------
이번에는 index_join 힌트를 사용해 보자.
SQL> select /*+ index_join(e idx_myemp1_sal SYS_C0012349) */
2 empno, sal from myemp1 e
3 where e.empno > 17000000
4 and e.sal > 2000000;
1999999 개의 행이 선택되었습니다.
경 과: 00:00:19.01
Execution Plan
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1500K| 17M| 46649
|* 1 | VIEW | index$_join$_001 | 1500K| 17M| 46649 (1)|
|* 2 | HASH JOIN | | | | |
|* 3 | INDEX RANGE SCAN| SYS_C0012349 | 1500K| 17M| 85002
|* 4 | INDEX RANGE SCAN| IDX_MYEMP1_SAL | 1500K| 17M| 1224K
--------------------------------------------------------------------
이번에는 SELECT 리스트에 인덱스에 없는 컬럼을 나열해 보자.
FULL SCAN 한다.
SQL> select /*+ index_join(e idx_myemp1_sal SYS_C0012349) */
2 empno, sal, ename
3 from myemp1 e
4 where e.empno > 17000000
5 and e.sal > 2000000;
1999999 개의 행이 선택되었습니다.
경 과: 00:00:35.15
Execution Plan
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1500K| 38M| 40104 (1)| 00:08:02
|* 1 | TABLE ACCESS FULL| MYEMP1 | 1500K| 38M| 40104 (1)| 00:08:02
--------------------------------------------------------------------
인덱스 조인을 유도하는 힌트로 효과적이기 위해서는 테이블에 만들어진 인덱스가 SELECT문장 리스트에 나타난 컬럼 들을 모두 가져야 한다. 테이블간 조인에 사용되는 것과 무관하게 하나의 테이블에 있는 여러 인덱스를 이용해 테이블 원본데이터 ACCESS없이 결과 집합을 만들 때 사용하는 인덱스 스캔방식 이다.
해시조인을 이용하며 index$_join$_xxx 의 형태로 실행계획에 표시된다.
[예]
SELECT /*+ INDEX_JOIN(e emp_mgr_ix emp_deptno_ix) */ deptno
FROM emp e
WHERE mgr < 7800
AND deptno < 20;
실습을 위한 예제 테이블은 다음 URL을 참조하여 만들자.
http://oraclejavanew.kr/bbs/board.php?bo_table=LecHINT&wr_id=117
MYEMP1 테이블의 인덱스는 PK(empno)외에는 없다.
[실습]
Oracle 11g R2에서의 테스트 결과이다.
Empno PK Unique인덱스외 sal 컬럼으로 B*TREE인덱스 하나 만들자.
select * from user_indexes where table_name = 'MYEMP1' 명령으로 인덱스를 조회해 보자. PK Unique인덱스의 이름은 SYS_C0012349 다.
SQL> desc myemp1;
이름 널? 유형
----------------------------------------- -------- -----------------
EMPNO NOT NULL NUMBER
ENAME VARCHAR2(100)
DEPTNO NUMBER
ADDR VARCHAR2(100)
SAL NUMBER
SUNGBYUL VARCHAR2(1)
SQL> set autotrace traceonly
SQL> set timing on
SQL> create index idx_myemp1_sal on myemp1(sal);
인덱스가 생성되었습니다.
힌트없이 실행하니 전체 테이블을 FULL SCAN 한다.
참고로 MYEMP! 테이블의 데이터 분포는 EMPNO인 경우 1부터 20,000,000까지 유일한 값을 가지고 있고 sal의 경우 0부터 2,999,999까지의 값으로 이루어져 있다. 2000만건이니 sal 값은 대략 6개 정도 중복되어 있다.
SQL> select empno, sal from myemp1 e
2 where e.empno > 17000000
3 and e.sal > 2000000;
1999999 개의 행이 선택되었습니다.
경 과: 00:00:31.50
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1500K| 17M| 40104 (1)| 00:08:02
|* 1 | TABLE ACCESS FULL| MYEMP1 | 1500K| 17M| 40104 (1)| 00:08:02
--------------------------------------------------------------------
이번에는 index_join 힌트를 사용해 보자.
SQL> select /*+ index_join(e idx_myemp1_sal SYS_C0012349) */
2 empno, sal from myemp1 e
3 where e.empno > 17000000
4 and e.sal > 2000000;
1999999 개의 행이 선택되었습니다.
경 과: 00:00:19.01
Execution Plan
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1500K| 17M| 46649
|* 1 | VIEW | index$_join$_001 | 1500K| 17M| 46649 (1)|
|* 2 | HASH JOIN | | | | |
|* 3 | INDEX RANGE SCAN| SYS_C0012349 | 1500K| 17M| 85002
|* 4 | INDEX RANGE SCAN| IDX_MYEMP1_SAL | 1500K| 17M| 1224K
--------------------------------------------------------------------
이번에는 SELECT 리스트에 인덱스에 없는 컬럼을 나열해 보자.
FULL SCAN 한다.
SQL> select /*+ index_join(e idx_myemp1_sal SYS_C0012349) */
2 empno, sal, ename
3 from myemp1 e
4 where e.empno > 17000000
5 and e.sal > 2000000;
1999999 개의 행이 선택되었습니다.
경 과: 00:00:35.15
Execution Plan
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1500K| 38M| 40104 (1)| 00:08:02
|* 1 | TABLE ACCESS FULL| MYEMP1 | 1500K| 38M| 40104 (1)| 00:08:02
--------------------------------------------------------------------
오라클자바커뮤니티에서 운영, 개발자 전문교육, 개인80%환급 오엔제이프로그래밍실무교육센터(www.onjprogramming.co.kr)
평일주간(9:30~18:30) 개강
(4/07)[기업100%환급]SQL기초에서 Schema Object까지
(4/07)[기업100%환급]자바기초에서 JDBC, Servlet/JSP까지
(4/14)C#4.0,ADO.NET,Network 프로그래밍
(4/14)[기업100%환급]Spring ,MyBatis,Hibernate실무과정
(4/14)[기업100%환급]PL/SQL,ORACLE HINT,TUNING
평일야간(19:00~22:00) 개강
(4/07)SQL초보에서실전전문가까지
(4/08)Spring3.X, MyBatis, Hibernate실무과정
(4/10)C#,ASP.NET마스터
(4/10)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(4/14)웹퍼블리싱 마스터
+ (4/22)안드로이드개발자과정
주말(10:00~18:00) 개강
(4/12)웹퍼블리싱 마스터
(4/12)SQL초보에서실전전문가까지
(4/12)안드로이드개발자과정
(4/12)JAVA기초에서실무까지
(4/19)C#,ASP.NET마스터
(4/19)Spring3.X, MyBatis, Hibernate실무과정
댓글 없음:
댓글 쓰기