기본 비활성 규칙

기본 비활성 규칙 (Default Disabled Rules)

현재 Pinot는 multi-stage 쿼리 최적화에 카디널리티 추정이나 비용 기반 검색 없이 Calcite의 HepPlanner를 사용해요. 즉 활성화된 모든 변환 규칙은 조건이 일치하는 순간 실행돼요.

출처: 문서

본문

특정 선택도(selectivity)와 카디널리티 조건에서만 유용한 규칙들이 있어요. 기본적으로 이들을 비활성화하고, 사용자가 필요할 때 활성화할 수 있도록 Pinot의 내장 기본 집합을 여기에 나열해요.

브로커는 pinot.broker.mse.planner.disabled.rules 구성으로 이 내장 집합을 대체할 수 있어요. 그렇게 하면 usePlannerRules 쿼리 옵션이 아래 내장 목록 대신 브로커 구성 집합에 적용돼요.

브로커 수준에서 내장 집합을 대체하면 opt-in으로 유지해야 하는 규칙을 그 구성 목록에 포함하세요. 예를 들어 SortProjectTranspose를 pinot.broker.mse.planner.disabled.rules에서 빼면 기본-비활성 집합에서 제거되므로, 쿼리에서 더 이상 usePlannerRules로 활성화할 필요가 없어요.

기본 비활성 규칙

JOIN_TO_ENRICHED_JOIN

소개

JOIN_TO_ENRICHED_JOIN은 더 이상 사용되지 않아요(deprecated). Pinot는 실험적인 enriched join 최적화를 제거했고, 현재 브로커는 이 플래너 규칙을 더 이상 등록하지 않아요. 여전히 JoinToEnrichedJoin을 요청하는 쿼리는 계획이 성공하지만, Pinot는 규칙 이름을 조용히 무시하고 일반 조인 계획을 생성해요.

사용 사례

새 워크로드에는 이 규칙을 활성화하지 마세요. 이전 usePlannerRules='JoinToEnrichedJoin' 참조는 정리하기 전까지만 유지하세요. Pinot는 실패시키지 않고 무시해요.

예시

예를 들어:

SET usePlannerRules='JoinToEnrichedJoin';
EXPLAIN PLAN FOR
SELECT a.col1 + b.col1
FROM a
JOIN b ON a.col1 = b.col1;

explain 계획에는 LogicalJoin 같은 일반 조인이 포함되어야 하고 EnrichedJoin은 포함되지 않아야 해요.

AGGREGATE_JOIN_TRANSPOSE_EXTENDED

소개

Calcite의 AGGREGATE_JOIN_TRANSPOSE_EXTENDED 규칙이에요. 이 규칙은 집계 함수가 분할 가능할 때 집계 함수를 조인 아래로 푸시/복제해요.

사용 사례

group-by가 입력 카디널리티를 크게 줄이고, 집계 함수 평가가 저렴할 때 이 규칙 사용을 고려해요. SET usePlannerRules='AggregateJoinTransposeExtended';

예시

예시 쿼리:

SELECT SUM(t1.b)
FROM t1 INNER JOIN t1
ON t1.a = t2.a
GROUP BY t1.a, t2.a

SORT_JOIN_TRANSPOSE

소개

Calcite의 SORT_JOIN_TRANSPOSE 규칙이에요. 안전하게 가능할 때 왼쪽/오른쪽 외부 조인의 보존측(preserve side) 아래로 limit이 있는 정렬을 푸시해요.

사용 사례

왼쪽/오른쪽 외부 조인의 보존측에 sort-limit이 있을 때 이 규칙 사용을 고려해요. SET usePlannerRules='SortJoinTranspose';

예시

TPC-H 예시 쿼리:

SELECT * 
FROM t1 LEFT JOIN t2
ON t1.a = t2.a
ORDER BY t1.a
LIMIT 100

SORT_PROJECT_TRANSPOSE

소개

Calcite의 SORT_PROJECT_TRANSPOSE 규칙이에요. 이 규칙은 Sort를 Project 아래로 밀어 넣어, Pinot가 프로젝션 표현식을 평가하기 전에 ORDER BY ... LIMIT을 적용할 수 있게 해요.

Pinot는 이 규칙을 기본적으로 비활성 상태로 유지해요. 주 논리 단계에서 활성화하면 파티션-힌트가 있는 IN (SELECT) 쿼리에서 사용되는 semi-join 재작성을 방해할 수 있어서, Pinot는 이를 usePlannerRules를 통한 opt-in 규칙으로 노출해요.

사용 사례

쿼리에 sort-limit 위에 프로젝션 작업이 있고, Pinot가 투영된 표현식을 평가하기 전에 행을 잘라내길 원할 때 이 규칙 활성화를 고려해요. SET usePlannerRules='SortProjectTranspose';

예시

예시 쿼리:

SET usePlannerRules='SortProjectTranspose';
SELECT city_name
FROM (
    SELECT LOWER(city) AS city_name, eventTime
    FROM dimStore
)
ORDER BY eventTime DESC
LIMIT 100

더 알아보기 (Learn more)