Trino 쿼리 최적화 — 비용 기반 실행 계획 만들기
Trino 쿼리 최적화 — 비용 기반 실행 계획 만들기
같은 SQL이라도 실행 계획을 어떻게 짜느냐에 따라 성능이 크게 달라져요. Trino는 쿼리 최적화(query optimizer)가 문장을 분석해 가장 효율적인 분산 실행 계획을 만들어 줘요. 이 장에서는 Trino의 최적화 기법 — 테이블 통계, 비용 기반 계획, 푸시다운, 적응형 최적화 — 을 정리해 드릴게요.
본문
테이블 통계(Table statistics)
최적화기의 기반이 되는 것은 테이블 통계예요. 행 수, 각 컬럼의 null 비율, distinct 값 수 같은 정보가 있어야 조인 순서나 조인 방식, 집계 전략을 합리적으로 정할 수 있어요. 커넥터가 또는 ANALYZE 문이 이 통계를 제공해요.
ANALYZE example.test_data.test;
통계가 없으면 최적화기는 기본값에 의존해야 해서 최적이 아닌 계획이 나올 수 있어요. 대용량 테이블을 분석하기 전에는 통계 갱신 비용을 고려해야 해요.
비용 기반 최적화(Cost-based optimizations)
Trino는 **비용 모델(cost model)**을 통해 조인 순서를 선택해요. 여러 테이블을 조인할 때 어떤 순서로 조인하느냐가 중간 결과의 크기를 결정하죠. 비용 기반 조인 재정렬(join reordering)이 유효하려면 관련 테이블의 통계가 충분히 정확해야 해요.
푸시다운(Pushdown)
필터·집계·조인 등을 Trino에서 다 처리하지 않고, 가능하면 원천 시스템(커넥터) 쪽으로 밀어내는 것이 푸시다운이에요. 원천에서 이미 줄여준 데이터만 Trino로 가져오므로 네트워크 전송과 처리 비용이 크게 줄어요.
-- WHERE 조건이 원천으로 푸시다운되어 불필요한 행을 애초에 읽지 않음
SELECT orderkey, totalprice, orderdate
FROM orders
WHERE orderdate >= DATE '2024-01-01';
적응형 계획 최적화(Adaptive plan optimizations)
Trino는 쿼리 실행 중에 런타임 통계를 활용해 계획을 동적으로 조정해요. 대표적인 예가 동적 필터링(dynamic filtering)이에요. 조인에서 한쪽의 탐색 키 값을 미리 알면 다른 쪽 스캔을 시작하기 전에 필터를 만들어, 읽어야 할 데이터를 크게 줄여요. 이는 대형 조인 쿼리에서 특히 효과적이에요.
실행 계획 살펴보기
EXPLAIN은 쿼리의 논리적·분산 실행 계획과 비용을 보여줘요.
EXPLAIN (TYPE DISTRIBUTED)
SELECT r.regionkey, count(*)
FROM nation n
JOIN region r ON n.regionkey = r.regionkey
GROUP BY r.regionkey;
EXPLAIN 결과에서 stage 분할, 조인 방식, 각 operator의 비용을 읽을 수 있으면 쿼리 튜닝이 훨씬 수월해져요. 통계가 비어 있는 테이블이 많다면 ANALYZE로 채워 최적화기가 제대로 일하게 해 주세요.