만일 총 직원수가 3만명인 사원테이블(BIG_EMP)에
메니져사원번호(MGR )가 7698 인 직원이 10,000 명이고,
부서번호(DEPTNO )가 60 인 직원이 1,200 명인 상황에서
위의 조건에 만족하는 직원의 리스트를 조회하려고 아래와 같은
쿼리를 만들려 한다면,
SELECT * FROM BIG_EMP
WHERE MGR=‘7698’ AND DEPTNO=’60’;
개발자는 당연히 부서번호(DEPTNO)가 60 인 직원을 먼저 조회한 후에
메니져사원번호(MGR)가 7698 인 직원인지
판단하는 로직으로 조회쿼리를 만들고 싶어 할 것이다.
물론 DEPARTMENT와 LOCATION 둘중하나의 컬럼에만 인덱스가 생성되어있다면 그 컬럼을 먼저
사용할것이므로 순서를 고민하지 않겠지만 두컬럼이 동일한 조건이라면
- MGR='7698' AND DEPTNO='60'
- DEPTNO='60' AND MGR='7698'
위에 두가지중에 무엇이 더 나을까 고민을 할 수도 있다.
규칙(RULE) 기반 옵티마이져라면
- 가장 나중에 생성한 인덱스가 있는 컬럼부터 파싱
- AND 조건이면 WHERE 절에서 가까운 순서대로, OR 조건이면 맨오른쪽에서 부터 순서대로
위의 순서대로 파싱을 한다.
비용(COST) 기반 옵티마이져(대부분의 DB가 이것을 사용함)라면 고민 할 필요가 없다.
옵티마이져가 알아서 순서를 정하기 때문이다.
즉. 대부분의 경우 컬럼의 순서에 신경쓸 필요가 없으며 구지 신경을 쓴다면 맨뒤에서 부터 WHERE 조건을 나열하면 된다.