KoreaIt Academy/Oracle DBMS

[Oracle] 옵티마이저(OPTIMIZER) , 힌트(hint)

hongeeii 2021. 8. 9.
728x90
반응형

OPTIMIZER

     COST : 예상 수행 시간, 쿼리를 수행하는 데 소요되는 일량 또는 시간
     CARDINALITY : 실행 결과의 건수

SQL을 가장 빠르고 효율적으로 수행할 최적의 처리경로(최저비용)를 생성해주는 DBMS 내부의 핵심 엔진입니다.
사용자가 쿼리문(SQL)으로 결과를 요청하면, 

이를 생성하는 데 필요한 처리경로는 DBMS에 내장된 옵티마이저가 자동으로 생성합니다.
옵티마이저가 생성한 SQL처리 경로를 실행 계획(Execution Plan)이라고 합니다.

 

 

OPTIMIZER의 SQL 최적화 과정 

사용자가 작성한 쿼리 수행을 위해, 실행될 만한 실행 계획을 찾습니다.
데이터 딕셔너리에 미리 수집해 놓은 오브젝트 통계 및 시스템 통계 정보를 이용해서
각 실행 계획의 예상 비용을 산정합니다.
각 실행계획을 비교해서 최저 비용을 갖는 하나를 선택하여 실행합니다.

 

 


OPTIMIZER의 종류 

1. 규칙기반 옵티마이저(RBO), 휴리스틱(Heuristic) 옵티마이저
-->미리 정해진 규칙에 따라 실행.
Oracle 10g버전 부터는 RBO에 대한 지원 중단

2. 비용기반 옵티마이저(CBO)
-->비용이 가장 낮은 실행계획을 선택

 

규칙기반 옵티마이저는 COST가 더 낮은 실행 계획이 있더라도, 미리 정해놓은 규칙에 따라 더 높은 COST의 실행계획을 실행하기도 합니다.

따라서 비효율적이라 10g버전부터는 RBO에 대한 지원을 중단을 하였습니다.

 

 

 

힌트(Hint) : /*+ hint */ 

SELECT문에 실행하고 싶은 계획을 전달할 때 사용하는 문법입니다.
잘못 작성되어도 실행할 때에는 무시되며 별도의 오류는 발생하지 않습니다.
/*+로 시작되며 */로 마칩니다.

또한 뒤에 컬럼명을 작성할 때 ,를 사용하지 않습니다.

SELECT /*+ INDEX_DESC(테이블명 PK명)*/ 컬럼명1, 컬럼명2, ... FROM 테이블명; //내림차순
SELECT /*+ INDEX(테이블명 PK명)*/ 컬럼명1, 컬럼명2, ... FROM 테이블명; //오름차순

 

 

힌트는 테이블의 인덱스를 가져와서 정렬을 시켜줍니다.

이 쿼리문을 쓰면 해당 테이블의 인덱스명을 알 수 있습니다.

 

정렬을 해주는 ORDER BY라는 함수가 있지만 ORDER BY는 정렬을 시키고자하는 데이터가 많아진다면,

SELECT를 하고나서 정렬을 시키느라 속도가 많이 느려집니다.

 

반면 hint는 SELECT전에 인덱스 번호로 접근하여 정렬을 시키기 때문에 데이터가 많아도 빠릅니다.

 

ORDER BY

-->CPU COST가 36,399,945 라고 나옵니다.

    동일한 쿼리를 hint를 사용하여 해보겠습니다.

 

 

hint

--> CPU COST가1,914,010 으로 ORDER BY보다 작은것을 알 수 있습니다.

 

 


이상으로 옵티마이저와 힌트에 대해 알아보았습니다.

728x90
반응형

추천 글