====3.3.6. 액세스 수단 선택을 위한 힌트==== * 액세스 수단을 선택할 수 있는 힌트들입니다. * 스캔 기본유형관련 페이지 : [ 3.2 실행계획의 유형 -> 3.2.1 스캔의 기본유형(page 184~210)편] ===FULL=== *힌트 내에서 정의된 테이블을 전체테이블 스캔 방식으로 유도하는 힌트이다. 예) SELECT /*+ FULL(t) */...... FROM big_table t WHERE cre_date >= '20050101'; ===HASH=== *해쉬 클러스터 테이블을 액세스할 때 해쉬 스캔방식으로 액세스하도록 유도하는 힌트이다. 예) /*+ HASH(table_name) */ ===CLUSTER=== *클러스터링 테이블을 액세스할 때 클러스터 인덱스를 통해 스캔하도록 유도하는 힌트이다. 예) /*+ CLUSTER(table_name) */ ===INDEX=== *인덱스 범위 스캔에의한 테이블 액세스를 유도하는 힌트이다. *뷰를 액세스하는 쿼리의 경우 뷰 쿼리 내에서는 테이블에 대한 인덱스 스캔을 지정할 수도 있다. 예) SELECT /*+ INDEX(s sales_pk) */.......... FROM sales s WHERE sale_date = '20051015'; SELECT /*+ INDEX(cust_v cust cname_idx) */...... FROM cust_v WHERE cust_name = 'TOMCAT'; \\ 여기서 cust_v는 cust테이블 액세스를 포함하고 있는 View이름이며, cname_idx는 cust 테이블의 cust_name컬럼에 대해 정의된 인덱스임. ===NO_INDEX=== 옵티마이져가 실행계획을 수립할 때 지정한 인덱스는 제외하고, 다른 액세스 방법을 고려하도록 유도하는 힌트이다. 예) SELECT /*+ NO_INDEX(m member_pk) */.......... FROM member m WHERE member_id > 10200; \\ *여기에 지정한 인덱스를 제외한 나머지 인덱스들을 액세스 수단으로 고려한다. 그러나 만약 인덱스를 지정하지 않고 테이블만 정의하면 해당 테이블의 모든 인덱스을 힌트 내에 정의한 것으로 인정하여 모든 인덱스를 고려 대상에서 제외한다. *동일한 인덱스를 NO_INDEX힌트와 함께 INDEX, INDEX_ASC, INDEX_DESC, INDEX_COMBINE, INDEX_FFS등에 사용하면 옵티마이져는 두 힌트 모두를 무시한다. *이런 특성을 이용해 튜닝을 위한 테스트를 할 때 기존에 부여했던 힌트를 지우지 않고 잠시 무시하도록 하기 위해 사용할수 있다. 또한 뷰 쿼리에 삽입한 힌트를 무시하고자 할 때도 적용할 수 있다. ===INDEX_ASC=== *인덱스를 경유하여 테이블을 액세스할때 힌트에 지정한 인덱스를 인덱스 컬럼값의 오름차순(정순)으로 범위 스캔하도록 유도하는 힌트 예) SELECT /*+ INDEX_ASC(a idx01) */........ FROM tab1 a WHERE col1 LIKE 'ABC%'; ===INDEX_DESC=== *인덱스르 경유하여 테이블을 액세스할때 힌트에 지정한 인덱스를 인덱스 컬럼값의 내림차순(역순)으로 범위 스캔하도록 유도하는 힌트 예) SELECT /*+ INDEX_DESC(a idx01) */........ FROM tab1 a WHERE col1 LIKE 'ABC%'; ===INDEX_COMBINE=== *2개의 이상의 인덱스를 비트맵 인덱스로 변경/결합하여 테이블을 액세스하는 방식으로 유도하는 힌트이다. 해당 인덱스, 비트맵 인덱스 모두 가능하며, 서로 다른 타입의 인덱스에서도 변경/결합이 가능하다. *INDEX_COMBINE 힌트에서 테이블 이름만 부여하고 인덱스 이름을 명시하지 않으면 옵티마이져가 해당 테이블에서 가장 적합한 인덱스를 선택하여 처리한다. 예) SELECT /*+ INDEX_COMBINE(e sal_bix hiredate_bix) */..... FROM emp e WHERE sal > 3000 AND hiredate < '20050715'; ===INDEX_FFS=== *전체 테이블을 스캔하는 것과 유사한 방법으로 인덱스 전체범위를 스캔하는 방식으로 유도하는 힌트이다. 비록 인덱스를 스캔하지만 다중블록을 스캔한다. \\ 예) SELECT /*+ INDEX_FFS(table_name index_name) */...... 이와 반대로 NO_INDEX_FFS 힌트에서 지정한 테이블의 인덱스에대해 '고속 전체 인덱스 스캔'방식을 제외한 다른 액세스 방법을 사용하도록 유도한다. ===INDEX_JOIN=== *2개 이상의 인덱스들만으로 조인을 수행하도록 유도하는 힌트이다. *이 때 인덱스를 구성하는 컬럼이 해당 질의에서 필요로 하는 모든 컬럼을 포함하고 있어야 한다. 즉, 테이블을 전혀 액세스하지 않고 인덱스들만으로 쿼리를 처리할수 있어야 한다. *인덱스 조인은 2개 이상의 인덱스를 범위 스캔한 결과를 ROWID로 해쉬 조인을 수행하여 결과를 얻는다. 예) SELECT /*+ INDEX_JOIN(e SAL_BMP HIREDATE_IX) */ sal, hiredate FROM emp e WHERE hiredate < sysdate AND sal > 2000; ===INDEX_SS=== *인덱스 스킵 스캔 방식으로 인덱스를 액세스하도록 유도하는 힌트이다. 예) SELECT /*+ INDEX_SS(e emp_idx) */.... FROM emp e WHERE hiredate = sysdate 이와 반대로 NO_INDEX_SS 힌트는 힌트에서 지정한 테이블의 인덱스에 대해 스킵스캔을 제외한 다른 액세스 방법을 사용하도록 유도한다. ===INDEX_SS_ASC=== *인덱스 스킵 스캔방식으로 범위 스캔하는 경우 오름차순으로 인덱스를 읽도록 하는 힌트이다. ===INDEX_SS_DESC=== *인덱스 스킵 스캔방식으로 범위 스캔하는 경우 내림차순으로 인덱스를 읽도록 하는 힌트이다. 예) SELECT /*+ INDEX_SS_DESC(e ename_ix) */........ FROM employees e WHERE first_name = 'Steven'; ==참조한문서== "오라클클럽" http://wiki.oracleclub.com/pages/viewpage.action?pageId=1966263&