힌트
힌트 (Hints)
multi-stage 쿼리 엔진 동작은 힌트(hints)로 커스터마이즈할 수 있어요. 힌트는 주석으로 제공되며, 예를 들어 /* hintType(hint1='value1',hint2='value2') */처럼 사용해요.
Apache Pinot는 다음 힌트를 지원해요:
aggOptions, aggregate operator에서 설명.windowOptions, window operator에서 설명.joinOptions, join operator에서 설명.setOpOptions, union, intersect, minus에서 설명.
출처: 문서
본문
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 쿼리에도 외부-래핑 형태를 선호해요.