MogDB 데이터베이스는 두 가지 실행 방식을 지원합니다. 행 기반 실행 엔진은 행 저장소 테이블에, 벡터화 실행 엔진은 열 저장소 테이블에 최적화되어 있습니다. 벡터화 엔진은 다음과 같은 이점을 제공합니다.
- 배치 단위로 데이터를 읽어 I/O 비용을 절감합니다.
- 배치 내 레코드 수가 많아 CPU 캐시 적중률이 향상됩니다.
- 파이프라인 모드로 실행되어 함수 호출 횟수가 줄어듭니다.
- 한 번에 여러 데이터를 처리하여 효율성이 높습니다.
이러한 특성 덕분에 분석 지향적인 복잡한 쿼리에서 더 나은 성능을 발휘합니다. 그러나 열 저장소 테이블은 데이터 삽입과 갱신이 빈번한 워크로드에는 적합하지 않습니다.
행 저장소 테이블의 분석 쿼리 성능을 개선하기 위해, MogDB는 행 저장소 테이블에서도 벡터화 실행 엔진을 사용할 수 있는 기능을 제공합니다. GUC 파라미터 try_vector_engine_strategy를 설정하면 행 저장소 테이블을 포함한 쿼리문을 벡터화된 실행 계획으로 변환하여 실행할 수 있습니다.
모든 쿼리 시나리오에서 행 저장소 테이블을 벡터화 엔진으로 전환하는 것이 유리한 것은 아닙니다. 벡터화 엔진의 강점은 표현식 계산, 다중 테이블 조인, 집계 연산 등에서 두드러집니다. 이론적으로, 행 저장소 테이블을 벡터화 방식으로 전환하면 오버헤드가 발생하여 성능이 저하될 수 있습니다. 하지만 위와 같은 연산들이 벡터화되어 실행되면 성능 향상을 얻을 수 있습니다. 따라서 최종 성능 개선 여부는 전환으로 인한 이점이 오버헤드를 상쇄하는지에 달려 있습니다.
TPCH Q1 벤치마크를 예로 들어보겠습니다. 행 기반 실행 엔진을 사용했을 때, 스캔 연산자는 405,210ms, 집계 연산자는 2,618,964ms가 소요되었습니다. 반면, 벡터화 엔진으로 전환하면 스캔 연산자(SeqScan + VectorAdapter)는 470,840ms, 집계 연산자는 212,384ms로 단축되어 전체 쿼리 성능이 개선되었음을 확인할 수 있습니다.
TPCH Q1 행 기반 실행 계획:
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------
Sort (cost=43539570.49..43539570.50 rows=6 width=260) (actual time=3024174.439..3024174.439 rows=4 loops=1)
Sort Key: l_returnflag, l_linestatus
Sort Method: quicksort Memory: 25kB
-> HashAggregate (cost=43539570.30..43539570.41 rows=6 width=260) (actual time=3024174.396..3024174.403 rows=4 loops=1)
Group By Key: l_returnflag, l_linestatus
-> Seq Scan on lineitem (cost=0.00..19904554.46 rows=590875396 width=28) (actual time=0.016..405210.038 rows=596140342 loops=1)
Filter: (l_shipdate <= '1998-10-01 00:00:00'::timestamp without time zone)
Rows Removed by Filter: 3897560
Total runtime: 3024174.578 ms
(9 rows)
TPCH Q1 벡터화 실행 계획:
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
Row Adapter (cost=43825808.18..43825808.18 rows=6 width=298) (actual time=683224.925..683224.927 rows=4 loops=1)
-> Vector Sort (cost=43825808.16..43825808.18 rows=6 width=298) (actual time=683224.919..683224.919 rows=4 loops=1)
Sort Key: l_returnflag, l_linestatus
Sort Method: quicksort Memory: 3kB
-> Vector Sonic Hash Aggregate (cost=43825807.98..43825808.08 rows=6 width=298) (actual time=683224.837..683224.837 rows=4 loops=1)
Group By Key: l_returnflag, l_linestatus
-> Vector Adapter(type: BATCH MODE) (cost=19966853.54..19966853.54 rows=596473861 width=66) (actual time=0.982..470840.274 rows=596140342 loops=1)
Filter: (l_shipdate <= '1998-10-01 00:00:00'::timestamp without time zone)
Rows Removed by Filter: 3897560
-> Seq Scan on lineitem (cost=0.00..19966853.54 rows=596473861 width=66) (actual time=0.364..199301.737 rows=600037902 loops=1)
Total runtime: 683225.564 ms
(11 rows)