본문 바로가기

프로그래밍/oracle

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

반응형

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


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


SQL> SELECT /*+ INDEX_DESC(E idx_emp_sal) */

               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)

 

 

 

 


반응형