02. 옵티마이저 행동에 영향을 미치는 요소
- (1) SQL과 연산자 형태
- (2) 인덱스, IOT, 클러스터링, 파티셔닝, MV등 옵티마이징 팩터
- (3) 제약 설정 : PK, FK, Not Null, Check
- (4) 옵티마이저 힌트
- (5) 통계정보 : 오브젝트 통계, 시스템 통계
- (6) 옵티마이저 관련 파라미터
- (7) DBMS 버젼과 종류
(1) SQL과 연산자 형태
- 결과가 같더라도 SQL을 어떤 형태로 작성했는지 또는 어떤 연산자를 사용했는지에 따라 옵티마이저가 다른 선택을 할 수 있고, 궁극적으로 쿼리 성능에 영향을 미친다.
(2) 인덱스, IOT, 클러스터링, 파티셔닝, MV등 옵티마이징 팩터
- 쿼리를 똑같이 작성하더라도 인덱스, IOT, 클러스터링, 파티셔닝, MV 등을 구성했는지 그리고 어떤 식으로 구성했는지에 따라 실행계획과 성능이 크게 달라진다.
(3) 제약 설정 : PK, FK, Not Null, Check
- 개체 무결성(Entity Integrity)
- 참조 무결성(Referential Integrity)
- 도메인 무결성(Domain Integrity)
- 사용자 정의 무결성(또는 업무 제약 조건)
select sum(주문수량), sum(주문금액), count(*), count(distinct 고객번호)
from 주문
where 고객번호 in (select 고객번호
from 고객
where 가입일자 >= trunc(add_months(sysdate, -12)))
and 주문일자 >= trunc(add_months(sysdate, -1))
- FK 제약과 옵티마이저 : 4장 6절 참고
- Not Null 제약과 옵티마이저
select deptno, count(*) from emp group by deptno;
alter table emp modify sal check (sal <= 5000);
select * from emp where sal > 5000
Rows Row Source Operation
---- ----------------------------------------------------
0 FILTER (cr=0 pr=0 pw=0 time=9 us)
0 TABLE ACCESS FULL EMP (cr=0 pr=0 pw=0 time=0 us)
(4) 옵티마이저 힌트
아래와 같은 경우가 아니면 힌트를 가장 우선적으로 따른다.
- 1. 문법적으로 맞지 않게 힌트를 기술
- 2. 잘못된 참조 사용 : 없는 테이블이나 별칭을 사용한 경우, 없는 인덱스명을 지정한 경우
- 3. 의미적으로 맞지 않게 힌트를 기술 : 예를 들어, 서브쿼리에 unnest와 push_subq를 같이 기술한 경우
- 4. 논리적으로 불가능한 액세스 경로 : 조인절이 등치(=) 조건이 하나도 없는데 해시 조인으로 유도하거나, 아래처럼 null 허용컬럼에 대한 인덱스를 이용해 전체 건수를 세려고 시도하는 등
select /*+ index(e emp_ename_idx) / count() from emp e - 5. 버그
(5) 통계정보 : 오브젝트 통계, 시스템 통계
(6) 옵티마이저 관련 파라미터
(7) DBMS 버젼과 종류
문서에 대하여