사용자 도구

사이트 도구


study:oracle:datadb:4week_2:chap6

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';
참조한문서
study/oracle/datadb/4week_2/chap6.txt · 마지막으로 수정됨: 2010/05/27 13:26 저자 zummaz