실행계획 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)
'프로그래밍 > oracle' 카테고리의 다른 글
oracle - 실행계획 SQL연산(MERGE ANTI-JOIN) (0) | 2012.08.17 |
---|---|
oracle - 실행계획 SQL연산(INLIST ITERATOR) (0) | 2012.08.17 |
oracle - 실행계획 SQL 연산(INDEX RANGE SCAN) (0) | 2012.08.17 |
oracle - 실행계획 SQL 연산(HASH SEMI-JOIN) (0) | 2012.08.17 |
oracle - 실행계획 SQL 연산(HASH JOIN) (0) | 2012.08.17 |