본문 바로가기

프로그래밍/oracle

oracle - [Hint]옵티마이저(Optimizer) 개요

반응형

[Hint]옵티마이저(Optimizer) 개요 

 

 

옵티마이저(Optimizer) 개요


옵티마이저(Optimizer)를 SQL문장을 실행하는데 가정 적절한 데이터 추출 경로(실행경로)를 결정하는 판단기 또는 내부 아키텍처라고 할 수 있는데 동일한 외형의 SQL문장일지라도 결과는 같지만 옵티마이저의 목표(Goal)에 따라 처리하는 내부 실행 경로는 다를 수 있습니다. 


오라클은 CBO(Cost-Based Optimizer)와 RBO(Rule-Based Optimizer)를 지원하며 CBO의 경우 오라클7부터 도입된 권장되는 방법이며 RBO의 경우 간단한 몇 가지 규칙을 통해서만 실행계획을 수립하는 방법입니다. CBO의 경우 테이블이나 인덱스의 통계 정보를 바탕으로 가장 현실적이며 융통성을 가지는 실행 계획을 만들어 내며, 지속적으로 성능이 향상되고 있으므로 이 방법을 이용하는 것이 바람직하다고 할 수 있습니다. RBO의 경우 데이터 건수 등에 상관없이 오로지 정해진 규칙(Rule)에 의해서만 실행 계획을 생성하는 획일적인 방법을 이용하므로 최근에는 CBO를 사용하는 추세로 가고 있습니다.


옵티마이저의 구성을 이해하기 위해 SQL문장이 어떻게 처리되는지 간단히 설명하면 다음과 같습니다.


……


사용자가 SQL문장을 Oracle Server에 보내게 되면 파싱단계(문법, 권한등 확인)를 거치며 옵티마이저가 비용기반 또는 규칙기반으로 SQL문을 최적화 하며 이를 통해 실행된 결과가 사용자에게 돌려지는 것입니다.


여기에서 파서는 SQL문의 문법이 맞는지등을 검사, DB객체(테이블, 인덱스등)와 참조되는 객체의 권한등을 검사하는데 이 단계가 끝나면 SQL문은 파싱트리(Parsed Tree)로 변형되어 옵티마이저에게 넘어갑니다.


옵티마이저는 이전단계의 파싱 트리를 이용하여 결과를 만드는데 가장 효율적인 방법을 찾기 위해 CBO or RBO를 이용하게 됩니다. CBO, RBO에 대해서는 다음 강좌에 설명을 하도록 하겠습니다.


다음에는 로우 소스 생성기 라는 것이 있어 옵티마이저에게 넘겨 받은 실행계획을 내부적으로 처리하기 위한 방법을 생성하는 단계인데, 실제 테이블에 Access 방법, Join 방법, Sort등을 위한 다양한 ROW SOURCE가 생성됩니다.


로우 소스 생성기에서 만들어진 각각의 ROW SOURCE는 SQL 실행엔진에 위해 실행되게 되어 결과를 만들어 내게 되는 거죠…


SQL 사용자는 옵티마이저의 Access 방법과 목표등을 설정 함으로서 옵티마이저가 실행 계획을 만들어 내는데 영향을 줄 수 있는데 특히 힌트를 이용하여 “이러한 경로로 데이터를 추출하세요” 라고 옵티마이저에게 알려줄 수 있습니다.

 

 

 

 


반응형