INDEX적용 - 인덱스를 사용하지 못하는 경우
1 NOT 연산자 사용
2 IS NULL, IS NOT NULL 사용
3 옵티마이저의 취사 선택
Optimizer의 자의적 판단에 의해서 인덱스를 사용할 수도 있고 사용하지 않을 수도 있는데, 이러한 것을 취사 선택이라고 함
Rule Base Optimizer는 정해진 규칙을 기준
Cost Base Optimizer는 비용을 기준
이러한 Optimizer의 자의적 판단으로 인한 잘못된 선택을 강제로 제어하기 위해서는 Hint를 사용
External Suppressing – SQL 작성 오류 (Misunderstanding)
① 불필요한 함수를 사용한 경우
WHERE SUBSTR(ENAME,1,1) = 'M';
WHERE ENAME LIKE ‘M%’;
② 문자열 결합
WHERE JOB||DEPTNO = 'MANAGER10';
WHERE JOB = ‘MANAGER’ AND DEPTNO = 10;
③ DATE 변수의 가공
WHERE T
O_CHAR(HIREDATE,‘YYYYMMDD') = ‘20021016’;
WHERE HIREDATE BETWEEN TO_DATE(‘20021016’,‘YYYYMMDD’) AND TO_DATE(‘20021016’,‘YYYYMMDD’)+0.99999;
④ 불필요한 NULL 처리
WHERE NVL(JOB,'NOJOB') = 'MANAGER'
WHERE JOB = = 'MANAGER';
⑤ 산술식의 적용
WHERE SAL*12 > 40000;
WHERE SAL > 40000/12;
External Suppressing – 개발자의 의도
사례 1 - 인덱스 사용여부 결정
① WHERE STATUS = ’퇴직’
② WHERE STATUS = ’재직’
WHERE RTRIM(STATUS) = ’재직’
사례 2 – 옵티마이저에 의한 취사 선택 WHERE STATUS = ’재직’ AND RESNO LIKE ’74%’
WHERE RTRIM(STATUS) = ‘재직’ AND RESNO LIKE ’74%’
사례 3 – 테이블 간 조인순서 제어
SELECT A.RESNO, A.GRENTDT, B.WEDDT FROM EMP_MASTER A, EMP_DETAIL B WHERE A.RESNO = B.RESNO AND RTRIM(A.GRENTDT) LIKE '1990%'
AND B.WEDDT LIKE '200210%';
Internal Suppressing – 연산식(Expression Evaluation)
VARCHAR2 or CHAR to NUMBER
VARCHAR2 or CHAR to DATE
간단한 연산식 Comm + ‘500’ 논리비교 연산식 Bonus > Sal / ‘10’ 함수호출 MOD (Sal, ‘1000’)
서로 다른 자료 형 간의 비교 시 발생
WHERE절 조건 WHERE Hiredate = ‘2003-01-01’
WHERE절 조건 WHERE Rowid = ‘AAAAaoAATAAAADAAA’
WHERE 문자형 칼럼(RESNO, VARCHAR2) = 숫자정보 (eg) WHERE RESNO = 7402191550521
WHERE TO_NUMBER(RESNO) = 7402191550521
Internal Suppressing – 할당(Assignment)
VARCHAR2 or CHAR to NUMBER
NUMBER to VARCHAR2
DATE to VARCHAR2
ROWID to VARCHAR2
HEX to VARCHAR2
VARCHAR2 or CHAR to DATE
VARCHAR2 or CHAR to ROWID
VARCHAR2 or CHAR to HEX
variable := expression
INSERT INTO table VALUES (expression1, expression2, ...)
UPDATE table SET column = expression
SELECT column INTO variable FROM table
4 외부적 변형(External Suppressing)
5 내부적 변형(Internal Suppressing)
댓글