create table t1 as
select 100 col1, '{A,B,C}'::character varying[] col2
union all
select 200, '{A,B,C}'::character varying[]
union all
select 150, '{X,Y,Z}'::character varying[]
union all
select 250, '{X,Y,Z}'::character varying[];
create table t2 as
select 'A' col1, 10 col2
union all
select 'B', 20
union all
select 'C', 25
union all
select 'X', 15
union all
select 'Y', 10
union all
select 'Z', 20;
考虑这个查询:
select t1.col1,
(select sum(col2)
from t2
where t2.col1 = any(t1.col2))
from t1;
我的理解是,如果我将该子查询实现为函数调用,并将该函数定义为IMMUTABLE
,它将执行两次,而不是四次。对于相关的子查询也是这样吗?
规划者是否为此目的评估输入数组的内容?
它不会缓存结果,无论是使用函数还是使用子查询。运行EXPLAIN
以说服自己。
这就是为什么对于这种请求应该使用join而不是subselect来避免嵌套循环的原因。