옵티마이저의 개요
사용자가 질의한 SQL문에 대해 최적의 실행 방법을 결정하는 역할을 수행한다.
최적의 실행 방법을 실행계획(Execution Plan)이라 한다.
어떤 방법으로 처리하는 것이 동일한 일을 최소의 일량으로 처리할 수 있을지 결정한다.
즉 다양한 실행방법들 중에서 최적의 실행방법을 결정하는 것이 옵티마이저의 역할이라고 할 수 있다.
우선순위 규칙에 따라 실행계획을 생상하며 인덱스가 있으면 반드시 인덱스를 사용한다.
규칙(우선순위)를 가지고 실행계획을 생성한다.
인덱스유무(유일, 비유일, 단일, 복합 인덱스)
연산자(=, <, ...)- 객체(힙 테이블, 클러스터 테이블)의 세 종류를 이용하여 SQL문을 실행한다.
규칙기반 옵티마이저는 우선순위가 높은 규칙이 적은 일량으로 해당 작업을 수행하는 방법
규칙 기반 옵티마이저의 규칙
규칙1. Single row by rowid
규칙4. Single row by unique or primary key
규칙8. Composite index
규칙9. Single column index
규칙 10. Bounded range search on indexed columns
11. Unbounded range search on indexed columns
- 인덱스를 이용한 액세스 방식이 전체 테이블 액세스 방식보다 우선순위가 높다.
- 조인 칼럼에 대한 인덱스가 양쪽 테이블에 모두 존재할 때, 우선순위가 높은 테이블을 선택한다.
- 조인 칼럼에만 인덱스가 존재하는 경우에는 인덱스가 없는 테이블을 먼저 선택하여 조인 수행한다.
- 만약 조인 테이블의 우선순위가 동일하지않다면, FROM 절에 나열된 테이블의 역순으로 수행한다.
- 양쪽 조인 칼럼에 모두 인덱스가 없는 경우 Sort Merge Join 사용- 조인 칼럼에 인덱스가 존재한다면 NL Join 사용한다.
SQL문을 처리하는데 필요한 비용이 가장 적은 실행계획을 선택하는 방식이며, 규칙기반 옵티마이저의 단점을 극복 하기 위하여 출현했다.
SQL문을 처리하는데 필요한 비용이 가장 적은 실행계획을 선택하는 방식
테이블, 인덱스, 칼럼 등의 다양한 객체 통계정보와 시스템 통계정보등을 이용한다.
처리 비용이 가장 적은 실행계획 선택한다.
데이터 딕셔너리(Data Dictionary)의 통계정보나 DBMS의 차이로 같은 쿼리도 다른 실행계획이 생성될 수 있다.
실행계획의 예측 및 제어가 어렵다.
질의 변환기, 대안 계획 생성기, 비용 예측기
요구한 사항을 처리하기 위한 절차와 방법을 의미한다.
실행계획을 생성한다는 것은 SQL을 어떤 순서로 어떻게 실행할 지를 결정하는 작업이다. 옵티마이저는 다양한 처리 방법들 중에서 가장 효율적인 방법을 찾아준다.
즉, 옵티마이저는 최적의 실행 계획을 생성해준다.
“SQL에서 요구한 사항을 처리하기위한 절차와 방법”
실행계획을 구성하는 요소에는 조인순서, 조인기법, 액세스기법, 최적화정보, 연산 등
동일한 SQL에 대해 결과를 낼 수 있는 다양한 처리 방법(실행계획)이 존재할 수 있지만 각 처리 방법마다 실행 시간(성능)은 서로 다를 수 있다.
옵티마이저는 다양한 처리 방법들 중에서 가장 효율적인 방법을 찾아준다.
조인 순서 : EMP ➡️ DEPT, NL Join 기법 사용, 인덱스 스캔 기법 사용, 각 최적화 정보 표시
논리적으로 가능한 조인 순서는 N!개 만큼 존재 (✅N: FROM절에 존재하는 테이블 수)
NL Join, Hash Join, Sort Merge Join 기법
인덱스 스캔, 전체 테이블 스캔 방법
최적화 정보 : Cost, Card, Bytes
최적화 정보는 통계 정보를 바탕으로 옵티마이저가 계산한 예상치
연산에는 조인기법, 엑세스 기법, 필터, 정렬, 집계, 뷰 등 다양한 종류가 존재한다.
SQL의 내부적인 처리절차를 시각적으로 표현한 도표
옵티마이저의 계획 | 옵티마이저의 필요성 |
오브젝트 통계, 시스템 통계 등의 정보를 사용 → 예상 비용 산정 | 개발자가 작성한 SQL문을 효율적으로 실행하기 위해 계획 수립 |
여러 실행계획 중에서, 최저비용의 실행계획을 선택함 | 개발자는 힌트를 사용하여 실행계획 변경을 요청할 수 있음 |
❓힌트(HINT): 개발자가 옵티마이저에게 실행방법을 알려주는 것
① SQL 실행 | ② 파싱 (Parsing) | ③ 실행계획 수립 | ④ 실행계획 저장 | ⑤ SQL 실행 및 인출 |
개발자가 SQL문을 작성하고 실행함 |
SQL의 문법검사 및 구문분석 수행 |
옵티마이저가 SQL 실행계획 수립 |
실행계획 수립 및 선정 완료 후 저장함 |
SQL 실행 및 데이터 인출 (Fetch) |
Query Transformer | Estimator | Plan Generator |
- SQL문을 효율적으로 실행하기 위함이다. - 좀 더 일반적이고 표준적인 형태로 변환한다. - 변환되어도 결과는 동일하다. |
- 최적의 실행계획을 위해 총비용을 계산한다. - 통계정보를 사용하여 SQL 실행비용 계산한다. - 각 단계의 선택도, 카디널리티, 비용 계산한다. |
- SQL을 실행할 실행계획 수립한다. - 하나의 쿼리를 수행하는 데에 후보군이 될만한 실행계획들을 생성한다. |