Этапы выполнения подзапроса Postgres - PullRequest
0 голосов
/ 25 января 2019

Предположим, у меня есть запрос, который говорит:

Select * from ( 
   select coalesce(mytable.created_date,mytable1.created_date) as created_date,...
   from mytable 
   left join mytable1 ON (mytable.id=mytable1.id)
   --Other Joins and tables here
) as foo
where created_date > CURRENT_DATE

Будет ли Postgres выбирать только те строки, где created_date is > CURRENT_DATE для внутренних запросов, где я присоединяюсь ко многим таблицам?

Или потребуетсявсе строки из mytable и сделать соединения с другими таблицами во внутреннем запросе, затем проверьте created_date > CURRENT_DATE.

Является ли мой предыдущий запрос таким же, как

select coalesce(mytable.created_date,mytable1.created_date),... from mytable 
    left join mytable1 ON (mytable.id=mytable1.id)
    --Other Joins and tables here 
WHERE 
    coalesce(mytable.created_date,mytable1.created_date) > CURRENT_DATE

1 Ответ

0 голосов
/ 25 января 2019

Как видите, когда вы используете EXPLAIN, оптимизатор может & ldquo; flatten & rdquo; такие подзапросы, так что планы выполнения для этих двух запросов будут одинаковыми.

Другими словами, оптимизатор может вставить условие WHERE в подзапрос и объединение, чтобы оно могло быть выполнено первым.

Более того, если created_date окажется столбцом mytable1, PostgreSQL определит, что created_date никогда не может быть NULL, и выполнит внутреннее, а не внешнее соединение.

...