1. Suppressing
인덱스 생성 후 인덱스사용이 제한되는 경우
1) 인덱스 칼럼 변형
SELECT * FROM EMP WHERE SUBSTR(DNAME,1,3) = 'ABC' ; // 인덱스변형.
-->
SELECT * FROM EMP WHERE DNAME LIKE 'ABC%' ;
* Like 의 경우 인덱스를 '첫글자 + %'의 경우는 인덱스 사용가능하지만, 첫글자가 아닌 글자에 대한 스캔시 인덱스 사용할수 없다.
SELECT * FROM EMP WHERE SAL * 12 = 12000000 ;
; 옵티마이저는 인덱스블록의 SAL * 12 를 한 후 테이블 액세스하는 것보다 full table scan이 빠르다고 판단하여 full table scan 수행.
-->
SELECT * FROM EMP WHERE SAL = 12000000 / 12 ;
SELECT * FROM EMP WHERE TO_CHAR(HIREDATE, 'YYMMDD') ='940101' ;
-->
SELECT * FROM EMP WHERE HIREDATE = TO_DATE('940101','YYMMDD') ;
; 날짜 형식으로 설정된 칼럼에서 특정일자의 데이터를 추출하는 과정에서
; 날짜형식에서 Range Scan 통한 추출시 date형식보다 문자형식으로
; 조건절에 자주등장하는 칼럼에 대해 날짜 형식이 아닌 문자형식으로
2) 내부적 데이터 변환
CHA 칼럼의 데이터 타입이 CHAR인 경우 내부적으로 형변환이 발생한다.
SELECT * FROM TAB WHERE CHA = 10 ;
-->
SELECT * FROM TAB WHERE TO_NUMBER(CHA) = 10 ;
SELECT * FROM TAB WHERE NUM LIKE '7410%';
;NUM이 NUMBER타입인 경우
-->
SELECT * FROM TAB WHERE TO_CHAR(NUM) LIKE '7410%';
SELECT * FROM TAB WHERE DAT = '20040501' ;
; DAT 가 Date타입인 경우
-->
SELECT * FROM TAB WHERE DAT = to_date('01-MAY-04') ;
* 다량의 데이터를 가진 테이블에 대해 형변환이 발생하면 응답속도의 저하가 발생.
2. Not Operator의 사용
* 인덱스가 설정되어 있는 컬럼에 대해 조건절에서 NOT을 사용하면 인덱스를 사용할수 없다.
SELECT ENAME INTO :COL1
FROM EMP
WHERE EMPNO <> '1234'
;
-->
SELECT ENAME INTO :COL1
FROM EMP
WHERE NOT EXISTS ( SELECT '1' FROM EMP WHERE EMPNO ='1234' )
;
* Not(<>)연산자 대용으로 Not Exists, Minus등을 이용하여 인덱스 유도.
Exists Not Exists
Not Exists는 조건절에 만족하는 데이터 발견시 바로 True를 리턴하며, 더 이상의 스캔을 발생시키지 않는 스캔 방식의 특성으로 인해 전체 범위처리가 아닌 부분 범위처리방식으로 처리됨. 인덱스에 직접적인 Not조건이나 Minus문장을 사용하는 것 보다 훨씬 나은 성능을 가지는 SQL문장을 작성할수 있다.
IN, NOT IN 처럼 Sub Query의 데이터를 Main Query 에 상수로 전달하는게 아니라 Sub Query의 데이터가 존재하는 지를 확인하는 경우 사용.
Sub Query절의 데이터가 여러건 나오더라도 최초 데이터가 추출되는 순간 더이상 데이터를 추출하지 않고, Main Query에 Return한다.
Munus
- 두집합간의 차집합을 추출
- 차집합을 추출하기 위해 내부적으로 sort 발생.(전체범위처리)
3. Null
- is not null : 인덱스사용에 제한을 받는다.
- 문자면 space, 숫자면 0보다 큰데이터를 추출하도록 유도
SELECT * FROM EMP WHERE ENAME IS NOT NULL ;
-->
SELECT * FROM EMP WHERE ENAME > ' ' ;
SELECT * FROM EMP WHERE COMM IS NOT NULL;
-->
SELECT * FROM EMP WHERE COMM > 0;
** 인덱스는 정렬되어 들어가는 구조임.
'DBMS > 오라클기타' 카테고리의 다른 글
Marge (0) | 2013.05.03 |
---|---|
두개이상 칼럼에 UPDATE하기 (0) | 2013.05.03 |
SYNONYM (0) | 2009.06.29 |
오라클 날짜함수 (0) | 2009.06.29 |
컬럼 unused 하기 (0) | 2008.12.01 |