(1) 조인 컬럼에 IS NOT NULL 조건 추가
select count(e.empno), count(d.dname)
from emp e, dept d
where d.deptno = e.deptno
and sal <= 2900
조인 컬럼 deptno가 null인 데이터는 조인 액세스가 불필요하다.
필터 조건을 추가해 주면 불필요한 테이블 액세스 및 조인 시도를 줄일 수 있어 쿼리 성능 향상에 도움이 된다.
select count(e.empno), count(d.dname)
from emp e, dept d
where d.deptno = e.deptno
and sal <= 2900
and e.edptno is not null
and d.deptno is not null
(2) 필터 조건 추가
select * from emp
where sal between :mn and :mx
바인드 변수 사용자가 :mx보다 :mn 변수에 더 큰 값을 입력한다면 쿼리 결과는 공집합이다.
8i까지는 실재 수행됨
9i부터는 수행을 방지하기 위해 옵티마이저가 임의로 필터 조건식을 추가
(3) 조건절 비교 순서
-----------------------------------------------------------------------------------------
| A | ... | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
-----------------------------------------------------------------------------------------
| B | 000 | 990 | 991 | 992 | 993 | 994 | 995 | 996 | 997 | 998 | 999 | 1000| 1001| ... |
-----------------------------------------------------------------------------------------
위 데이터를 아래 SQL문으로 검색하면 B 컬럼에 대한 조건식을 먼저 평가하는 것이 유리하다.
select * from t
where A = 1
and B = 1000;
반대로 A = 1 조건식을 먼저 평가한다면, A 컬럼이 대부분 l이어서 B 컬럼에 대한 비교 연산까지 그만큼 수행해야 하므로 CPU 사용량이 늘어남.
조건절을 처리할 때도 부등호0) 조건을 먼저 평가하느냐 like 조건을 먼저 평가하느냐에 따라 일량에 차이가 생긴다.
select /* + full(도서) */ 도서 번호, 도서 명 , 가격 , 저자I 출판사, isbn
from 도서
where 도서명 > : last_book nm
and 도서명 like :book_nm || '%'
옵티마이저는,테이블 전체를 스캔하거나 인텍스를 수평적으로 스캔할 때의 Filter 조건식을 평가할 때 선택도가 낮은 컬럼을 먼저 처리하도록 순서를 조정한다
옵티마이저 모드
-----------------------------------------------------------------------------------------------------------
| RBO | where 절에 기술된 반대 순서로 |
-----------------------------------------------------------------------------------------------------------
| CBO (I/O Costing 모드) | where 절에 기술된 순서대로 |
-----------------------------------------------------------------------------------------------------------
| CBO (CPU Costing 모드) | 비교 연산해야 할 일량을 고려해 옵티마이저가 결정 선택도가 낮은 조건식부터 평가 |
-----------------------------------------------------------------------------------------------------------