LOAD 'pg_hint_plan'; SET search_path TO public; SET pg_hint_plan.debug_print TO on; SET client_min_messages TO LOG; SET pg_hint_plan.enable_hint TO on; CREATE EXTENSION file_fdw; CREATE SERVER file_server FOREIGN DATA WRAPPER file_fdw; CREATE USER MAPPING FOR PUBLIC SERVER file_server; CREATE FOREIGN TABLE ft1 (id int, val int) SERVER file_server OPTIONS (format 'csv', filename '/home/horiguti/work/pg_hint_plan/pg_hint_plan/data/data.csv'); -- foreign table test SELECT * FROM ft1; id | val ----+----- 1 | 1 2 | 2 3 | 3 4 | 4 5 | 5 6 | 6 7 | 7 8 | 8 9 | 9 10 | 10 (10 rows) \t EXPLAIN (COSTS false) SELECT * FROM s1.t1, ft1 ft_1, ft1 ft_2 WHERE t1.c1 = ft_1.id AND t1.c1 = ft_2.id; Nested Loop Join Filter: (t1.c1 = ft_2.id) -> Nested Loop -> Foreign Scan on ft1 ft_1 Foreign File: /home/horiguti/work/pg_hint_plan/pg_hint_plan/data/data.csv -> Index Scan using t1_i1 on t1 Index Cond: (c1 = ft_1.id) -> Foreign Scan on ft1 ft_2 Foreign File: /home/horiguti/work/pg_hint_plan/pg_hint_plan/data/data.csv ---- ---- No. S-1-5 object type for the hint ---- -- No. S-1-5-6 /*+SeqScan(t1)SeqScan(ft_1)SeqScan(ft_2)*/ EXPLAIN (COSTS false) SELECT * FROM s1.t1, ft1 ft_1, ft1 ft_2 WHERE t1.c1 = ft_1.id AND t1.c1 = ft_2.id; LOG: pg_hint_plan: used hint: SeqScan(t1) not used hint: SeqScan(ft_1) SeqScan(ft_2) duplication hint: error hint: Nested Loop Join Filter: (t1.c1 = ft_2.id) -> Hash Join Hash Cond: (t1.c1 = ft_1.id) -> Seq Scan on t1 -> Hash -> Foreign Scan on ft1 ft_1 Foreign File: /home/horiguti/work/pg_hint_plan/pg_hint_plan/data/data.csv -> Foreign Scan on ft1 ft_2 Foreign File: /home/horiguti/work/pg_hint_plan/pg_hint_plan/data/data.csv ---- ---- No. J-1-6 object type for the hint ---- -- No. J-1-6-6 /*+MergeJoin(ft_1 ft_2)Leading(ft_1 ft_2 t1)*/ EXPLAIN (COSTS false) SELECT * FROM s1.t1, ft1 ft_1, ft1 ft_2 WHERE t1.c1 = ft_1.id AND t1.c1 = ft_2.id; LOG: pg_hint_plan: used hint: MergeJoin(ft_1 ft_2) Leading(ft_1 ft_2 t1) not used hint: duplication hint: error hint: Nested Loop -> Merge Join Merge Cond: (ft_1.id = ft_2.id) -> Sort Sort Key: ft_1.id -> Foreign Scan on ft1 ft_1 Foreign File: /home/horiguti/work/pg_hint_plan/pg_hint_plan/data/data.csv -> Sort Sort Key: ft_2.id -> Foreign Scan on ft1 ft_2 Foreign File: /home/horiguti/work/pg_hint_plan/pg_hint_plan/data/data.csv -> Index Scan using t1_i1 on t1 Index Cond: (c1 = ft_1.id) ---- ---- No. L-1-6 object type for the hint ---- -- No. L-1-6-6 /*+Leading(ft_1 ft_2 t1)*/ EXPLAIN (COSTS false) SELECT * FROM s1.t1, ft1 ft_1, ft1 ft_2 WHERE t1.c1 = ft_1.id AND t1.c1 = ft_2.id; LOG: pg_hint_plan: used hint: Leading(ft_1 ft_2 t1) not used hint: duplication hint: error hint: Nested Loop -> Nested Loop Join Filter: (ft_1.id = ft_2.id) -> Foreign Scan on ft1 ft_1 Foreign File: /home/horiguti/work/pg_hint_plan/pg_hint_plan/data/data.csv -> Foreign Scan on ft1 ft_2 Foreign File: /home/horiguti/work/pg_hint_plan/pg_hint_plan/data/data.csv -> Index Scan using t1_i1 on t1 Index Cond: (c1 = ft_1.id) ---- ---- No. R-1-6 object type for the hint ---- -- No. R-1-6-6 \o results/ut-fdw.tmpout /*+Rows(ft_1 ft_2 #1)Leading(ft_1 ft_2 t1)*/ EXPLAIN SELECT * FROM s1.t1, ft1 ft_1, ft1 ft_2 WHERE t1.c1 = ft_1.id AND t1.c1 = ft_2.id; LOG: pg_hint_plan: used hint: Leading(ft_1 ft_2 t1) Rows(ft_1 ft_2 #1) not used hint: duplication hint: error hint: \o \! sql/maskout.sh results/ut-fdw.tmpout Nested Loop (cost=xxx rows=1 width=xxx) -> Nested Loop (cost=xxx rows=1 width=xxx) Join Filter: (ft_1.id = ft_2.id) -> Foreign Scan on ft1 ft_1 (cost=xxx rows=1 width=xxx) Foreign File: /home/horiguti/work/pg_hint_plan/pg_hint_plan/data/data.csv Foreign File Size: 42 -> Foreign Scan on ft1 ft_2 (cost=xxx rows=1 width=xxx) Foreign File: /home/horiguti/work/pg_hint_plan/pg_hint_plan/data/data.csv Foreign File Size: 42 -> Index Scan using t1_i1 on t1 (cost=xxx rows=1 width=xxx) Index Cond: (c1 = ft_1.id) \! rm results/ut-fdw.tmpout