● 옵티마이저(OPTIMIZER)
- SQL을 가장 빠르고 효율적으로 수행할 최적의 처리경로(최저비용)를 생성해주는 DBMS 내부의 핵심 엔진
- 사용자가 쿼리문(SQL)으로 결과를 요청하면, 이를 생성하는 데 필요한 처리경로는
DBMS에 내장된 옵티마이저가 자동으로 생성한다.
- 옵티마이저가 생성한 SQL 처리경로를 실행 계획(Execution Plan)이라고 한다.
※ COST : 예상 수행 시간, 쿼리를 수행하는 데 소요되는 일량 또는 시간
※ CARDINALITY : 실행 결과의 건수
● 옵티마이저의 SQL 최적화 과정
- 사용자가 작성한 쿼리 수행을 위해, 실행될 만한 실행 계획을 찾는다.
- 데이터 딕셔너리에 미리 수집해 놓은 오브젝트 통계 및 시스템 통계 정보를 이용해
각 실행 계획의 예상 비용을 산정한다.
- 각 실행 계획을 비교해서 최저 비용을 갖는 하나를 선택하여 실행한다.
● 옵티마이저 종류
1. 규칙 기반 옵티마이저(RBO), 휴리스틱(Heuristic) 옵티마이저
- 미리 정해진 규칙에 따라 실행
- Oracle 10g 버전부터는 RBO에 대한 지원 중단
2. 비용 기반 옵티마이저(CBO)
- 비용이 가장 낮은 실행 계획을 선택
※SQL 실행 순서
FROM > WHERE > GROUP BY > HAVING > SELECT > ORDER BY
● 힌트(Hint) : /*+ hint*/
- SELECT문에 실행하고 싶은 계획을 전달할 때 사용하는 문법
- 잘못 작성되어도 실행할 때에는 무시되며 별도의 오류는 발생하지 않는다.
- /*+로 시작되며 */로 마친다. 또한 뒤에 컬럼명을 작성할 때 ','를 사용하지 않는다.
- SELECT /*+ INDEX_DESC(테이블명 PK명)*/ 컬럼명1, 컬럼명2, ... FROM 테이블명
(ex)
※ 힌트(Hint) 사용 전 PLAYER 테이블의 INDEX값(PK값) 검색
SELECT I.INDEX_NAME FROM USER_IND_COLUMNS I
WHERE TABLE_NAME = 'PLAYER';
1. PLAYER 테이블에서 PLAYER_PK 컬럼을 기준으로 INDEX를 내림차순으로 가져오기
SELECT /*+ INDEX_DESC(PLAYER PLAYER_PK)*/ * FROM PLAYER;
2. PLAYER 테이블에서 PLAYER_PK 컬럼을 기준으로 INDEX를 오름차순으로 가져오기
SELECT /*+ INDEX(PLAYER PLAYER_PK)*/ * FROM PLAYER;