Коррелированные подзапросы и неизменные функции - PullRequest
0 голосов
/ 28 ноября 2018
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 голосов
/ 28 ноября 2018

Он не будет кешировать результаты ни с помощью функции, ни с помощью подзапроса.Запустите EXPLAIN, чтобы убедить себя.

Вот почему вы должны использовать объединение, а не подвыбор для этого типа запроса, чтобы избежать вложенного цикла.

...