이전 포스팅에서 join이 어떻게 처리되는지 살펴봤습니다. 이번 포스팅에서는 쿼리 처리 모델에 대해 살펴보겠습니다.
Query Processing Model
DBMS가 쿼리를 어떻게 처리할 것인지는 query processing model에 의해 결정됩니다. 대표적으로 iterator model, materialization model, vectorized / batch model이 존재합니다.
Iterator Model
Java의 Iterator의 동작 방식과 유사합니다. DBMS의 iterator model의 모든 operator는 next() 함수를 구현합니다. next() 함수는 하나의 tuple 또는 null 값을 반환합니다. 각각의 operator는 child operator의 next() 함수를 while loop을 통해 호출하는 구조입니다.
SELECT student.name, class.name
FROM student
JOIN student.class_id = class.id
WHERE class.id > 100
다음 쿼리가 어떻게 실행되는지 살펴보겠습니다.
Iterator model은 다수의 DBMS에서 활용하는 방식입니다. 몇 가지 operator는 child operator가 tuple을 모두 반환할 때까지 기다리는 blocking 방식으로 동작합니다(join, subquery, order by 등).
Materialization Model
Materialization model은 iterator model과 다르게 operator가 결과물(tuples)을 하나씩 반환하지 않고 모아서 반환합니다.
데이터의 수가 많지 않다면 Iterator Model에 비해 함수 호출 오버헤드가 작다는 장점이 있습니다. 처리할 데이터의 양이 비교적 적은 OLTP에는 좋은 모델이지만 처리할 데이터 수가 많은 OLAP 작업의 경우 메모리에 부담이 될 수 있습니다.
Vectorized / Batch Model
Iterator Model과 Materialization Model의 장점을 혼합한 모델입니다. 튜플이 일정한 개수에 도달하면 parent operator에 결과물을 반환합니다.
Iterator model에 비해 함수 호출 횟수가 적어 그만큼 오버헤드가 적습니다. 또한 각 operator에서 결과물이 완성될 때까지 기다린 후 반환하는 게 아니라, 특정 수 이상의 tuple이 모이면 반환하기 때문에 materialization model에 비해 메모리 부담이 적습니다.
다음으로는 쿼리 처리에 필요한 데이터를 가져오는 방법(access methods)에 대해 살펴보겠습니다.
Access Methods
Access method는 테이블에 저장된 데이터를 접근하는 방법입니다. 대표적으로 sequential scan, index scan, multi-index / bitmap scan이 존재합니다.
Sequential Scan
Sequential scan은 버퍼 풀에 저장된 페이지를 가져와서 해당 페이지에서 원하는 튜플을 추출하는 방식입니다. DBMS는 cursor을 통해서 가장 마지막에 탐색한 페이지의 위치를 기록합니다.
DBMS는 sequential scan최적화를 위한 다양한 방법을 활용합니다. 다양한 Sequential scan 최적화 방법이 존재하지만 이번 포스팅에서는 Zone Maps만 짚고 넘어가겠습니다.
Zone Maps
미리 계산된 값을 통해 sequential scan에서 작업을 수행해야 하는지의 여부를 결정합니다.
위의 그림을 보면 val > 600을 만족하는 값이 zone map에 존재하지 않습니다. 따라서 sequential scan을 수행하지 않고도 결괏값을 반환할 수 있습니다.
Index Scan
Index를 활용하는 방법입니다. 어떤 인덱스를 사용할 것인지는 다음과 같은 요건에 따라 결정됩니다.
- 인덱스에 포함된 칼럼
- 쿼리에 포함된 칼럼
- Predicate composition
- 인덱스를 구성하는 칼럼이 unique인지 non-unique인지
Multi-Index / Bitmap Scan
여러 인덱스를 활용해서 추출한 데이터에서 공통된 데이터(intersection)를 추출하는 방식입니다.
마무리
이번 포스팅을 통해 DBMS가 쿼리에 필요한 데이터를 어떻게 가져오는지 살펴봤습니다. 다음 포스팅에서는 쿼리의 병렬 처리에 대해 알아보겠습니다.
'Database > DBA급 개발자로' 카테고리의 다른 글
[Database] DBA급 개발자로 - #13 Rule based 쿼리 최적화 (0) | 2022.09.15 |
---|---|
[Database] DBA급 개발자로 - #12 Query Processing 2/2 (0) | 2022.09.13 |
[Database] DBA급 개발자로 - #10 Join Algorithm (0) | 2022.09.11 |
[Database] DBA급 개발자로 - #9 Sorting & Aggregation (0) | 2022.09.09 |
[Database] DBA급 개발자로 - #8 Index Concurrency Control (2) | 2022.09.07 |