2013년 8월 3일 토요일

(oracle hint)-실행계획 SQL연산(INDEX RANGE SCAN DESCENDING, INDEX UNIQUE SCAN)

실행계획 SQL연산
(INDEX RANGE SCAN DESCENDING, INDEX UNIQUE SCAN)

구로디지털 오엔제이프로그래밍실무교육센터


인덱스 영역에서 데이터를 찾은 후 역순으로 인덱스 블록을 Scan 하므로 당연히 데이터는 역순으로 정렬되어 있습니다. 흔히 이렇게 역순으로 출력하기 위해(인덱스가 있음에도 불구하고) ORDER BY를 사용하기도 하는데 아래의 예를 잘 보시고 이 방법을 이용하도록 하자구요~

SQL> SELECT
               ENAME,
               SAL
      FROM   EMP E
      WHERE SAL > 0;

Execution Plan
--------------------------------------------------------------------
0       SELECT STATEMENT Optimizer=CHOOSE
1       0   TABLE ACCESS (BY INDEX ROWID) OF EMP
2       1      INDEX (RANGE SCAN DESCENDING) OF idx_emp_sal (NON-UNIQUE)


위에서 보인 INDEX_DESC는 오라클의 힌트 구문으로 idx_emp_sal 인덱스에서 역순으로 SCAN 하라는 의미를 가집니다.

아래와 같은 방법은 좋은 방법이 아닙니다. 위의 SQL 문장과 비교하여 보세요~

SQL> SELECT ENAME,
               SAL
      FROM   EMP E
      ORDER  BY SAL DESC;


한편 INDEX UNIQUE SCAN Unique한 인덱스에서 Unique한 값을 추출하는 연산인데 하나의 ROW를 추출하는데 있어 가장 좋은 방법입니다.

아래는 Primary Key 생성시 만들어진 Unique 인덱스를 이용하여 로우를 추출하는 예입니다.
SQL> SELECT ENAME,
               SAL
      FROM   EMP E
      WHERE EMonO =1004;

Execution Plan
--------------------------------------------------------------------
0       SELECT STATEMENT Optimizer=CHOOSE
1      0   TABLE ACCESS (BY INDEX ROWID) OF EMP
2      1      INDEX (UNIQUE SCAN) OF pk_emp (UNIQUE) 

댓글 없음:

댓글 쓰기