조인 연산
조인 연산 (Join Operations - join-operations)
DuckDB는 비용 기반 쿼리 옵티마이저를 사용해 조인 순서를 자동으로 정해줘요. 그런데 특정 상황에서는 이 옵티마이저가 내린 조인 순서가 마음에 안 들 수도 있어요. 이 페이지에서는 조인 순서를 수동으로 강제하는 두 가지 방법을 알려드릴게요.
개요 (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;