Teiid 는 연합 쿼리를 소스별 SQL 로 나눠 보내고(pushdown) 결과를 엔진에서 조인한다[1]. 어떤 조건이 소스로 내려가는지, 조인 순서를 어떻게 정하는지가 성능을 좌우한다. 아래는 MSSQL · Oracle · MySQL 세 소스를 묶은 VDB 에서 시험한 기록이다.
소스로 내려가는 조인 조건은 A = B 와 A IN (값 목록) 형태다. 소스 사이의 조인 조건은 기본적으로 내려가지 않고 각 소스에서 전체를 읽어 온 뒤 엔진이 조인한다. 그래서 큰 테이블끼리 조인하면 의존 조인(dependent join) 으로 한쪽 결과의 키 값을 다른 쪽 조건으로 넘겨야 한다.
SELECT *
FROM mssql1.supplier, orcl2.supplier, mssql2.supplier
WHERE mssql1.supplier.s_suppkey = orcl2.supplier.s_suppkey
AND orcl2.supplier.s_suppkey = mssql2.supplier.s_suppkey;
순서와 상관없이 소스마다 전체 조회 SQL 이 생성되고, 결과를 엔진이 조인한다.
SELECT * FROM mssql1.supplier;
SELECT * FROM orcl2.supplier;
SELECT * FROM mssql2.supplier;
/*+ MAKEDEP */ 를 붙인 테이블은 의존 조인의 의존 쪽이 된다. 상대 테이블의 키 값을 먼저 받아 IN 조건으로 소스에 보내므로 그 테이블의 SQL 이 가장 나중에 실행된다.
SELECT *
FROM /*+ MAKEDEP */ mssql1.supplier, orcl2.supplier, mssql2.supplier
WHERE mssql1.supplier.s_suppkey = orcl2.supplier.s_suppkey
AND orcl2.supplier.s_suppkey = mssql2.supplier.s_suppkey;
SELECT * FROM orcl2.supplier;
SELECT * FROM mssql2.supplier;
SELECT * FROM mssql1.supplier WHERE mssql1.supplier.s_suppkey IN (<orcl2.supplier.s_suppkey 값들>);
동등한 두 테이블에 모두 힌트를 주면 FROM 절에 먼저 나온 테이블부터 의존 조인 대상이 된다.
SELECT *
FROM /*+ MAKEDEP */ mssql1.supplier, /*+ MAKEDEP */ orcl2.supplier, mssql2.supplier
WHERE mssql1.supplier.s_suppkey = orcl2.supplier.s_suppkey
AND orcl2.supplier.s_suppkey = mssql2.supplier.s_suppkey;
SELECT * FROM orcl2.supplier;
SELECT * FROM mssql2.supplier;
SELECT * FROM mssql1.supplier WHERE mssql1.supplier.s_suppkey IN (<orcl2.supplier.s_suppkey 값들>);
힌트 대신 MAKEDEP 를 뷰 정의나 비용 통계(cardinality)로 유도할 수도 있다. 통계가 있으면 옵티마이저가 작은 쪽을 스스로 의존 쪽으로 고른다.
SELECT c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice, SUM(l_quantity)
FROM mysql2.orders, mssql1.lineitem, orcl1.customer
WHERE c_custkey = o_custkey
AND o_orderkey = l_orderkey
AND o_orderkey IN (
SELECT DISTINCT l_orderkey
FROM mssql1.lineitem
GROUP BY l_orderkey
HAVING SUM(l_quantity) > 313)
GROUP BY c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice
ORDER BY o_totalprice DESC, o_orderdate;
IN 서브쿼리는 그 소스에 통째로 내려가지 않고, 소스에는 다음처럼 컬럼 조회만 보내고 집계는 엔진이 한다.
SELECT "tpch"."dbo"."LINEITEM"."L_ORDERKEY", "tpch"."dbo"."LINEITEM"."L_QUANTITY" FROM "tpch"."dbo"."LINEITEM";
SELECT SUM(l_extendedprice * (1 - l_discount)) AS revenue
FROM tpch.tpchj.lineitem, tpch.tpchj.part
WHERE (p_partkey = l_partkey AND p_brand = 'Brand#32'
AND p_container IN ('SM CASE', 'SM BOX', 'SM PACK', 'SM PKG')
AND l_quantity >= 8 AND l_quantity <= 8 + 10
AND p_size BETWEEN 1 AND 5
AND l_shipmode IN ('AIR', 'AIR REG') AND l_shipinstruct = 'DELIVER IN PERSON')
OR (p_partkey = l_partkey AND p_brand = 'Brand#24'
AND p_container IN ('MED BAG', 'MED BOX', 'MED PKG', 'MED PACK')
AND l_quantity >= 16 AND l_quantity <= 16 + 10
AND p_size BETWEEN 1 AND 10
AND l_shipmode IN ('AIR', 'AIR REG') AND l_shipinstruct = 'DELIVER IN PERSON')
OR (p_partkey = l_partkey AND p_brand = 'Brand#44'
AND p_container IN ('LG CASE', 'LG BOX', 'LG PACK', 'LG PKG')
AND l_quantity >= 27 AND l_quantity <= 27 + 10
AND p_size BETWEEN 1 AND 15
AND l_shipmode IN ('AIR', 'AIR REG') AND l_shipinstruct = 'DELIVER IN PERSON');
두 테이블의 조인 결과를 OR 로 묶으면 엔진이 OR 가지마다 조인을 따로 수행해 UNION 으로 합친다. 가지 수만큼 소스 조회가 늘어나므로 가능하면 OR 를 IN 이나 CASE 로 바꾼다.
Teiid 16.0.x Reference Guide — Federated Optimizations (dependent joins · MAKEDEP). 2026-09-20 확인. https://teiid.github.io/teiid-documents/16.0.x/content/reference/Federated_Optimizations.html ↩︎