GEKO와 혼동하지 않고이 작업을 수행 할 수있는 한 가지 방법은 CTE를 사용하는 것입니다.
CTE는 최적화 장벽이므로 CTE 내부의 조인을 원하는 순서대로 래핑 할 수 있으며 PG는 강제로 그렇게합니다.
예를 들어 DB가 t1과 t2를 먼저 조인하고 t4 와만 조인하려면 다음과 같이 실행할 수 있습니다.
explain
with j1 as (select *,t1.c4 as t1c4 from t1 join t2 on (t1.c2=t2.id))
,j2 as (select * from j1 join t4 on (t1c4=t4.id))
select * from j2;
결과는 다음과 같습니다.
QUERY PLAN
-------------------------------------------------------------------------------
CTE Scan on j2 (cost=51485.00..67785.00 rows=815000 width=64)
CTE j1
-> Hash Join (cost=3473.00..14521.00 rows=815000 width=40)
Hash Cond: (t2.id = t1.c2)
-> Seq Scan on t2 (cost=0.00..26.30 rows=1630 width=20)
-> Hash (cost=1637.00..1637.00 rows=100000 width=20)
-> Seq Scan on t1 (cost=0.00..1637.00 rows=100000 width=20)
CTE j2
-> Hash Join (cost=289.00..36964.00 rows=815000 width=64)
Hash Cond: (j1.t1c4 = t4.id)
-> CTE Scan on j1 (cost=0.00..16300.00 rows=815000 width=44)
-> Hash (cost=164.00..164.00 rows=10000 width=20)
-> Seq Scan on t4 (cost=0.00..164.00 rows=10000 width=20)
(13 rows)
이것은 단지 예일 뿐이며 필요에 따라 변경할 수 있습니다. 어떤 경우에도 PG는 다른 CTE 사이의 순서를 변경할 수 없습니다.
그것이 도움이되기를 바랍니다 :)