Lookup Join 전략

Lookup Join 전략

Lookup join은 테이블 중 하나가 dimension table일 때 적용할 수 있는 특별한 join 전략이에요. 이 경우 Pinot는 dimension table이 주어진 테넌트의 모든 서버에 복제된다는 것이 보장되는 사실을 활용해, 서버 간 데이터 셔플 없이 조인을 실행할 수 있어요.

참고: Lookup join은 SSE에서 지원되었던 유일한 조인 종류인 Lookup UDF Join과 유사한 성능을 제공해요. Lookup UDF는 multi-stage 쿼리에서 사용해서는 안 돼요.

출처: 문서

본문

이 기법은 Pinot 1.3.0에서 도입되었고 기본적으로 비활성화돼 있어요. SELECT 절에 joinOptions 힌트를 지정해 특정 쿼리에 대해 활성화할 수 있어요. 현재 구현에는 몇 가지 전제 조건/제한 사항도 있어요:

  • 오른쪽 테이블이 dimension table로 구성되어야 해요.
  • 오른쪽 테이블의 모든 primary-key 컬럼이 정확히 하나의 lookup 값을 받아야 해요. 값은 ON 또는 WHERE 조건의 equi-join 키 또는 리터럴과의 등가에서 올 수 있어요.
  • 조건의 순서가 primaryKeyColumns의 순서와 일치할 필요는 없어요. Pinot는 스키마 순서로 lookup 키를 만들어요.
  • primary-key가 아닌 dimension 컬럼의 join 키, 하나의 primary-key 컬럼에 대한 중복 키, 또는 누락된 primary-key 구성 요소는 조용히 빈 결과나 잘못된 결과를 반환하는 대신 쿼리를 실패시켜요. 그러한 조건에는 lookup 힌트를 제거하고 일반 join을 사용해요.

예를 들어:

SELECT /*+ joinOptions(join_strategy='lookup') */
    A.col1, B.col2
FROM A
JOIN B -- this must be a dimension table
ON A.col2 = B.joinKey -- B.joinKey must be the primary key of B

primaryKeyColumns: ["currency", "rate_start_date"] 같은 복합 키의 경우 리터럴이 하나의 키 구성 요소를 제공할 수 있어요:

SELECT /*+ joinOptions(join_strategy='lookup') */
    f.amount, r.rate
FROM fact_sales f
JOIN dim_rates r
  ON r.rate_start_date = f.rate_start_date
 AND r.currency = 'gbp'

조건 순서는 lookup을 바꾸지 않고 반대로 할 수 있어요. BYTES primary-key 컬럼의 리터럴은 지원되지 않아요. SEMI와 ANTI lookup join은 그 출력이 해당 필터를 평가하는 데 필요한 오른쪽-테이블 컬럼을 포함하지 않기 때문에 비-등가 조건을 지원하지 않아요.

Physical Optimizer 지원

Pinot 1.6.0부터 lookup join은 V2 physical optimizer에서 지원돼요. 이전에는 physical optimizer와 함께 lookup join을 사용하려고 하면 옵티마이저가 dimension table에 BROADCAST_EXCHANGE를 삽입해 LookupJoinOperator와 호환되지 않는 별도의 fragment로 분할했기 때문에 "Right input must be leaf operator"로 실패했어요.

V2 physical optimizer와 함께 lookup join을 사용할 때:

  • dimension table은 join과 같은 fragment에서 LeafOperator로 유지돼요.
  • EXPLAIN 계획은 dimension table 쪽에 LOOKUP_LOCAL_EXCHANGE 유사-교환을 보여줘요.
  • 이 유사-교환은 데이터를 별도의 fragment로 분할하지 않아요. 계획 표현을 위한 것뿐이에요.

현재 제한 사항:

  • MSE lite 모드의 lookup join은 아직 지원되지 않아요.
  • dimension table + primary key join 조건에 기반한 lookup join의 자동 감지는 아직 구현되지 않았어요.

더 알아보기 (Learn more)