force_convert_in_exists¶
用在子查询中,强制使用 [NOT] IN 与 [NOT] EXISTS 间改写后的计划。
举例:
-- 清理环境
drop table t1 cascade;
drop table t2 cascade;
drop table t3 cascade;
-- 创建表
create table t1(a int);
create table t2(a int);
create table t3(a int);
insert into t1 select random() from generate_series(1, 10);
insert into t2 select random() from generate_series(1, 10);
insert into t3 select random() from generate_series(1, 100);
analyze t1;
analyze t2;
analyze t3;
-- 使用force_convert_in_exists
explain select * from t1 left join t2 on t1.a in (select /*+ force_convert_in_exists */ a from t3);
QUERY PLAN(text)
----------------------
Nested Loop(Left Join) (cost=7.11..841.21 rows=50 width=8)
Join Filter: (subplan)
-> Seq Scan on T1 (cost=0.00..7.10 rows=10 width=4)
-> Materialize (cost=7.11..7.21 rows=10 width=4)
-> Seq Scan on T2 (cost=0.00..7.10 rows=10 width=4)
SubPlan
-> Seq Scan on T3 (cost=0.00..8.25 rows=1 width=4)
Filter: ($1 = A)
总数目:8
-- 不使用force_convert_in_exists, 则会根据代价模型选择代价低的计划
explain select * from t1 left join t2 on t1.a in (select a from t3);
QUERY PLAN(text)
----------------------
Nested Loop(Left Join) (cost=7.11..16.71 rows=50 width=8)
Join Filter: (hashed subplan)
-> Seq Scan on T1 (cost=0.00..7.10 rows=10 width=4)
-> Materialize (cost=7.11..7.21 rows=10 width=4)
-> Seq Scan on T2 (cost=0.00..7.10 rows=10 width=4)
SubPlan
-> Seq Scan on T3 (cost=0.00..8.00 rows=100 width=4)
总数目:7
-- 删除表
drop table t1 cascade;
drop table t2 cascade;
drop table t3 cascade;