关联子查询与不变函数

时间:2018-11-28 01:50:07

标签: postgresql query-optimization correlated-subquery

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,它将执行两次,而不是四次。 相关子查询也是如此吗?

计划者是否为此目的评估输入数组的内容?

1 个答案:

答案 0 :(得分:0)

它既不缓存函数,也不缓存子查询。运行EXPLAIN以说服自己。

这就是为什么您应该对此类请求使用联接而不是子选择来避免嵌套循环的原因。