힌트

힌트 (Hints)

multi-stage 쿼리 엔진 동작은 힌트(hints)로 커스터마이즈할 수 있어요. 힌트는 주석으로 제공되며, 예를 들어 /* hintType(hint1='value1',hint2='value2') */처럼 사용해요.

Apache Pinot는 다음 힌트를 지원해요:

출처: 문서

본문

setOpOptions

setOpOptions를 사용해 Pinot가 UNION, UNION ALL, INTERSECT, EXCEPT / MINUS 아래에 삽입하는 교환(exchange)을 제어해요.

is_colocated_by_set_op_keys

타입: Boolean

기본값: 플래너 선택

옵션이 설정되지 않으면 V1 플래너는 UNION ALL 입력에 로컬 교환을 사용하고 다른 set-op 입력이 이미 호환 가능하게 파티셔닝되어 있는지 자동 감지해요. 다음으로 그 결정을 명시적으로 재정의할 수 있어요:

  • 'true'는 모든 입력에서 사전-파티셔닝된 직접 교환을 강제해요.
  • 'false'는 모든 입력에서 셔플된 해시 교환을 강제해요.

UNION ALL의 경우 'false'만 기본 동작을 변경해요. 입력 작업자 레이아웃을 유지하는 것이 바람직하지 않은 스큐를 일으킬 때 per-query 대체로 사용해요. 입력 작업자 수가 정렬되지 않으면 Pinot는 영향을 받는 로컬 교환을 자동으로 해시 교환으로 승격해요.

이 힌트는 V1 플래너에서만 인정돼요. V2 physical optimizer는 이를 무시하고 set-op colocation을 스스로 결정해요.

Pinot는 힌트를 두 곳에서 받아들여요:

  • 첫 번째 분기에 인라인:
SELECT /*+ setOpOptions(is_colocated_by_set_op_keys='true') */ col FROM a
UNION ALL
SELECT col FROM b
  • set 연산을 감싸는 외부 SELECT에:
SELECT /*+ setOpOptions(is_colocated_by_set_op_keys='true') */ *
FROM (
  SELECT col FROM a
  INTERSECT
  SELECT col FROM b
)

경고: 모든 입력이 하나 이상의 프로젝션된 컬럼에서 호환 가능하게 파티셔닝되어 같은 전체 출력 행이 같은 작업자에 도착할 때만 'true'를 강제해요. 그렇지 않으면 INTERSECT, EXCEPT, 일반 UNION이 잘못된 결과를 반환할 수 있어요. UNION ALL은 행만 연결하므로 항상 안전해요.

일반 UNION에는 외부-래핑 형태를 사용해요. Pinot가 교환 규칙이 인라인 힌트를 해석하기 전에 재작성하기 때문이에요. 힌트를 모든 set-op 수준에 적용하려면 중첩된 INTERSECT 또는 EXCEPT 쿼리에도 외부-래핑 형태를 선호해요.

더 알아보기 (Learn more)