본문으로 건너뛰기
최종 수정: 에

비용 기반 재작성을 위한 CBO 규칙을 힌트로 제어하기

읽기 전 확인 사항​

  • Doris 옵티마이저의 기본 동작 흐름을 이해하고 있습니다
  • 특정 쿼리에 대해 특정 CBO 규칙(예: 집계 푸시다운)을 활성화해야 합니다
  • 일반 비즈니스 애플리케이션 개발자가 아닌 DBA 또는 전문 튜닝 엔지니어를 대상으로 합니다
참고

Doris는 기본 설정만으로도 강력한 기능을 제공하며 대부분의 시나리오에서 성능을 자동으로 최적화하므로, 힌트를 사용한 수동 튜닝은 거의 필요하지 않습니다. 이 문서는 주로 전문 튜닝 엔지니어를 대상으로 합니다. 비즈니스 사용자는 개념만 이해하면 됩니다.

개요​

USE_CBO_RULE은 단일 SQL 문 내에서 지정한 CBO 비용 기반 재작성 규칙을 명시적으로 활성화하는 쿼리 힌트입니다.

Doris 옵티마이저는 실행 계획을 생성할 때 두 가지 유형의 규칙을 적용합니다.

최적화 유형전체 이름판단 기준대표적인 전략
RBORule-Based Optimizer통계와 무관한 사전 정의된 휴리스틱 규칙조건자 푸시다운, 프로젝션 푸시다운
CBOCost-Based Optimizer데이터 통계를 바탕으로 비용을 추정하고 비용이 가장 낮은 계획을 선택접근 경로 선택, 조인 알고리즘 선택

세밀한 튜닝이 필요한 일부 시나리오에서는 DBA나 개발자가 CBO 규칙의 활성화 여부를 수동으로 제어해야 합니다. 이때 쿼리 힌트를 사용할 수 있습니다.

구문​

목적: 단일 SELECT 문 내에서 하나 이상의 CBO 규칙을 명시적으로 활성화합니다.

명령:

SELECT /*+ USE_CBO_RULE(rule1, rule2, ...) */ ...

참고 사항:

  • 힌트는 SELECT 키워드 바로 뒤에 위치해야 합니다.
  • 괄호 안에 활성화할 규칙 이름을 나열하고, 여러 개인 경우 쉼표로 구분합니다.
  • 규칙 이름은 대소문자를 구분하지 않습니다.

지원되는 CBO 규칙​

현재 Doris 옵티마이저는 다음과 같은 비용 기반 재작성 규칙을 지원하며, USE_CBO_RULE로 명시적으로 활성화할 수 있습니다.

규칙 이름효과
PUSH_DOWN_AGG_THROUGH_JOIN집계 연산을 조인 양쪽으로 푸시다운합니다
PUSH_DOWN_AGG_THROUGH_JOIN_ONE_SIDE집계 연산을 조인 한쪽으로 푸시다운합니다
PUSH_DOWN_DISTINCT_THROUGH_JOINDistinct 연산을 조인 아래로 푸시다운합니다

사례: 집계 푸시다운으로 조인 쿼리 성능 높이기​

시나리오: 테이블 a를 테이블 b와 device_id를 기준으로 조인하고, 그 결과를 event_id와 group_id별로 집계합니다. 조인 전에 테이블 a를 집계하여 조인에서 처리해야 하는 데이터량을 줄이려고 합니다.

SQL 예제:

explain shape plan
select /*+ USE_CBO_RULE(push_down_agg_through_join_one_side) */
a.event_id,
b.group_id,
COUNT(a.event_id)
from a
join b on
a.device_id = b.device_id
group by
a.event_id,
b.group_id
;

재작성된 실행 계획:

PhysicalResultSink
--hashAgg[GLOBAL]
----hashAgg[LOCAL]
------hashJoin[INNER_JOIN] hashCondition=((a.device_id = b.device_id)) otherCondition=()
--------hashAgg[LOCAL]
----------PhysicalOlapScan[a]
--------filter((cast(experiment_id as DOUBLE) = 73.0))
----------PhysicalOlapScan[b]

추가된 hashAgg[LOCAL]이 테이블 a의 스캔 위에 배치되어 조인 전에 집계를 수행하는 것을 확인할 수 있습니다. 이를 통해 조인에 입력되는 데이터량이 줄어들어 쿼리 속도가 빨라집니다.

자주 묻는 질문​

Q1: USE_CBO_RULE은 언제 사용해야 하나요?

Doris가 특정 CBO 규칙을 기본적으로 적용하지 않지만, 현재 데이터 분포를 고려했을 때 해당 규칙이 도움이 된다고 판단한 경우에만 수동으로 활성화하면 됩니다. 대부분의 경우 옵티마이저의 자동 판단을 신뢰하는 것이 좋습니다.

Q2: 힌트의 규칙 이름은 대소문자를 구분하나요?

아니요, 대소문자를 구분하지 않습니다. PUSH_DOWN_AGG_THROUGH_JOIN_ONE_SIDE와 push_down_agg_through_join_one_side는 동일합니다.

Q3: 여러 규칙을 동시에 활성화할 수 있나요?

네. 규칙을 쉼표로 구분하면 됩니다. 예: /*+ USE_CBO_RULE(rule1, rule2) */.

Q4: 힌트를 잘못된 위치에 넣거나 규칙 이름의 철자를 잘못 입력하면 어떻게 되나요?

힌트는 SELECT 키워드 바로 뒤에 위치해야 합니다. 규칙 이름의 철자가 잘못되면 힌트는 적용되지 않지만, SQL은 기본 실행 계획을 사용하여 정상적으로 실행됩니다.

RBO와 CBO 비교​

비교 항목RBOCBO
판단 기준휴리스틱 규칙데이터 통계(비용 추정)
통계 의존 여부아니요예
적용 시나리오일반적이며 결과가 정해진 최적화데이터 분포와 밀접하게 연관된 최적화
USE_CBO_RULE로 제어 가능 여부아니요예

요약​

USE_CBO_RULE 힌트를 적절히 사용하면 특정 시나리오에서 고급 CBO 최적화 규칙을 수동으로 활성화하여 쿼리 성능을 개선할 수 있습니다. 효과적으로 사용하려면 쿼리 최적화와 데이터 특성을 깊이 이해해야 합니다. 대부분의 경우에는 여전히 Doris 옵티마이저의 자동 판단에 맡기는 것이 가장 좋은 선택입니다.