Join 전략
Join 전략 (Join Strategies)
출처: 문서
조인을 실행하려면 조인할 테이블의 모든 행이 같은 위치에 있어야 해요. Postgres 같은 고전적인 데이터베이스에서는 보통 단일 서버가 있거나(또는 모든 서버가 모든 데이터를 가짐) 이 문제가 없어요. 하지만 테이블의 행이 서버에 분산된 Pinot 같은 분산 데이터베이스에서는 데이터를 서버 간에 셔플해야 해요(적어도 일반적인 경우에는). 이 데이터 셔플은 비용이 크고 쿼리 성능의 병목이 될 수 있어요.
조인을 실행하는 가장 간단한 방법은 모든 데이터를 단일 서버로 이동하는 것이에요. 아래 다이어그램과 같이요.

점선 화살표는 셔플을, 실선 화살표는 서버 내 전송을 의미해요.
이 접근 방식은 작은 테이블에는 작동할 수 있지만 단일 서버에 맞지 않는 큰 테이블에는 확장되지 않아요. Pinot는 이것이 일반적인 경우가 될 것이라고 가정하므로 이 방식을 결코 사용하지 않아요. 여기서 보여주는 것은 셔플 문제를 이해하는 데 도움을 주기 위한 것뿐이에요.
Pinot가 하는 것은 쿼리 시점에 가상 파티션(virtual partitions) 을 만드는 것이에요. 이 가상 파티션은 조인해야 하는 행이 같은 서버로 보내지는 것을 Pinot가 보장할 수 있도록 만들어지지만, 동시에 서버 간에 셔플되어야 하는 데이터 양을 최소화하려고 해요.
Pinot가 데이터 셔플을 줄이기 위해 사용할 수 있는 여러 전략이 있어요. 그중 일부는 매우 효과적이어서 데이터 셔플 없이 조인을 실행하는 데 사용할 수 있지만 특정 경우에만 적용 가능해요.
효과 순서대로 전략은 다음과 같아요.
이 기술들은 각자의 페이지에서 더 자세히 설명돼요. 향후 더 많은 join 전략이 추가될 거예요. GitHub 이슈 #14518에 나열되어 있어요.