조인 연산

조인 연산 (Join Operations - join-operations)

DuckDB는 비용 기반 쿼리 옵티마이저를 사용해 조인 순서를 자동으로 정해줘요. 그런데 특정 상황에서는 이 옵티마이저가 내린 조인 순서가 마음에 안 들 수도 있어요. 이 페이지에서는 조인 순서를 수동으로 강제하는 두 가지 방법을 알려드릴게요.

출처: DuckDB 공식 문서 — join-operations

개요 (Overview)

DuckDB는 비용 기반 쿼리 옵티마이저가 있어요. DuckDB 데이터베이스나 Parquet 파일에 저장된 기본 테이블의 통계를 사용해 연산의 카디널리티를 추정하죠. 그런데 이 옵티마이저가 항상 원하는 조인 순서를 선택하는 건 아니에요.

조인 순서 강제하기 (How to Force a Join Order)

조인 순서 옵티마이저 끄기 (Turn off the Join Order Optimizer)

조인 순서 옵티마이저를 끄려면 다음 PRAGMA를 설정해요.

SET disabled_optimizers = 'join_order,build_side_probe_side';

이 설정은 조인 순서 옵티마이저와 조인의 좌/우 스와핑을 모두 비활성화해요. 이러면 DuckDB는 JOIN 절의 순서를 따라 left-deep 조인 트리를 만들어요.

SELECT ...
FROM ...
JOIN ...  -- 이 조인이 먼저 수행됩니다
JOIN ...; -- 이 조인이 두 번째로 수행됩니다

문제 쿼리를 실행한 후에는 다음 명령으로 옵티마이저를 다시 켜야 해요.

SET disabled_optimizers = '';

임시 테이블 만들기 (Create Temporary Tables)

특정 조인 순서를 강제하는 또 다른 방법은, 쿼리를 여러 개로 나눠 각각 임시 테이블을 만드는 거예요.

CREATE OR REPLACE TEMPORARY TABLE t1 AS
    ...;

-- 첫 번째 쿼리 결과 t1에 대해 조인
CREATE OR REPLACE TEMPORARY TABLE t2 AS
    SELECT * FROM t1 ...;

-- t2를 사용해 최종 결과 계산
SELECT * FROM t1 ...

정리하려면 중간 테이블을 삭제하면 돼요.

DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;

더 알아보기 (Learn more)