새로쓴 대용량 데이터베이스솔루션 1 (2008년)
액세스 수단 선택을 위한 힌트 0 0 5,477

by 구루비 Hint 힌트 FULL HASH INDEX INDEX_SS [2009.05.07]


3.3.6. 액세스 수단 선택을 위한 힌트

참고:액세스 수단을 설명하면서 대분의 내용이 언급되었음 VLDB: 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';
 

문서에 대하여

  • 최초작성자 : 임주영
  • 최초작성일 : 2008년 3월 20일
  • 이 문서는 오라클클럽 대용량 데이터베이스 스터디 모임에서 작성하였습니다.
  • 이 문서의 내용은 이화식님의 새로쓴 대용량 데이터베이스 솔루션을 참고했습니다.
  • 이 문서를 다른 블로그나 홈페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^\^
"구루비 데이터베이스 스터디모임" 에서 2008년에 "새로쓴 대용량 데이터베이스 솔루션1" 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/2573

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입