사용자 도구

사이트 도구


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.1274934383.txt.gz · 마지막으로 수정됨: 2010/05/27 13:26 저자 zummaz