programming/database
데이터베이스 옵티마이저
worldint
2024. 12. 1. 10:20
옵티마이저란?
데이터베이스 옵티마이저(Database Optimizer)는
데이터베이스에서 SQL 쿼리를 빠르고 효율적으로 실행하기 위해 최적의 실행 계획을 만들어준다
옵티마이저의 목적은 쿼리 실행에 필요한 비용을 최소화하여 성능을 극대화하는 것이다
이 비용에는 디스크 I/O, CPU 사용량, 네트워크 트래픽 등이 포함된다
옵티마이저의 종류
- 규칙 기반 옵티마이저(Rule-Based Optimizer, RBO):
이 옵티마이저는 사전 정의된 규칙에 따라 쿼리를 최적화한다
예를 들어, 특정한 형태의 쿼리에서는 항상 인덱스를 사용하는 방식으로 최적화하는 식
이 방식은 상대적으로 간단하지만 최신 데이터베이스에서는 사용하지 않는다
특정 우선순위 - 비용 기반 옵티마이저(Cost-Based Optimizer, CBO):
대부분의 현대적인 데이터베이스 관리 시스템(DBMS)에서 사용되는 방법
CBO는 테이블의 통계 정보와 실행 비용을 바탕으로 가장 효율적인 실행 계획을 선택한다
테이블의 데이터 분포나 인덱스의 효율성 등을 고려하여 더 정교한 실행 계획을 수립
통계정보는 딕셔너리라는곳에 저장,업데이트한다
옵티마이저 동작 방식
- Parser : SQL문장의 문법, 구조를 분석하여 쿼리 트리 생성
- 쿼리트리란
```
SELECT name
FROM employees
WHERE department = 'IT';
//위와 같은 쿼리가 들어오면 아래의 트리구조로 변경이됨
SELECT
|
FILTER (department = 'IT')
|
TABLE SCAN (employees)
```
- 쿼리트리란
- Optimization
- Query Trasformer : 파싱된 SQL을 보고, 동일한 결과를 도출하는 더 좋은 쿼리가 있으면 그것으로 바꿈
- Estimator: 시스템 통계정보를 딕셔너리로부터(통계정보 저장하는 저장소)
수집하여 SQL을 실행할 때 소요되는 총비용을 계산한다 - Plan Generator : Estimator를 통해 계산된 값들을 토대로 후보군이 되는 실행계획을 도출한다
- Row-Source Genarator : 옵티마이저가 생성된 실행계획을 SQL 엔진이 실제 실행할 수 있는 코드나 프로시저 형태로 포맷팅 한다
- postgresql을 예로들면 row-source genarator에 의해서 c언어로 된 함수가 생성되고, 그것을 엔진이 실행하는 형태라고 한다
- SQL Engine : sql을 실행합니다
통계정보
비용기반 옵티마이저에서 실행계획을 짜기 위해서 사용되는 정보이다
특정 주기를 설정하여 디비가 자동으로 통계정보를 갱신하도록 할 수 도 있고
사용자가 직접 만든 통계정보를 사용하도록 할 수도 있다
통계정보요소
테이블 크기 | 테이블에 저장된 총 레코드 수로, 테이블의 규모를 파악하여 최적의 접근 방식을 결정하는 데 사용된다 |
데이터 분포 | 특정 열의 값들이 어떻게 분포되어 있는지를 나타내며, 선택도를 예측하여 최적의 인덱스 사용 여부를 결정한다 |
인덱스 정보 | 인덱스가 어떤 열에 적용되었는지, 그리고 그 인덱스의 효율성을 평가하여 실행 계획을 수립하는 데 사용됨 |
널 값 비율 | 특정 열에 널(null) 값이 얼마나 있는지를 나타내며, 옵티마이저가 조인이나 필터링 조건을 더 효율적으로 처리하도록 도움 |
데이터 블록 수 | 테이블이나 인덱스를 저장하는 데 필요한 데이터 블록의 수로, I/O 비용을 예측하는 데 중요한 요소 |
클러스터링 팩터 | 인덱스의 순서와 테이블의 실제 데이터 순서 간의 관계를 나타내며, 테이블에 대한 접근 비용을 추정하는 데 사용 |