Выберите несколько столбцов из cte с помощью плана оптимизатора нескольких подзапросов

#sql #postgresql #oracle

Вопрос:

Представьте себе sql — запрос, подобный следующему. Как будет выглядеть план выполнения в oracle и postgres и почему?

Рассматриваемые части являются 3-мя подразделами с from cte предложением.

 with cte as (
   select
     sum(amount) sum_amount
   , count(*) my_count
   , orderid
   from order_details
   group by orderid
)
select 
  order.orderid
, (select sum_amount from cte where cte.orderid = order.orderid)
, (select my_count from cte where cte.orderid = order.orderid)
, (select orderid from cte where cte.orderid = order.orderid)
from order; 
 

Я думаю, что оптимизатор oracle достаточно умен, чтобы не выполнять часть cte 3 раза. Но как он это делает?

Комментарии:

1. Как будет выглядеть план выполнения в двух разных базах данных? Запустите его. это действительно единственный способ. Это зависит от определений ваших таблиц, размеров данных и используемых параметров конфигурации (ну, особенно в Oracle).

2. Я сделал. Мне нужно объяснение, почему.

3. @MikhailBoyarsky . . . Я бы посоветовал вам удалить этот вопрос и задать новый вопрос с двумя планами выполнения, если вы действительно хотите попытаться ответить . Этот вопрос все еще может быть не очень хорошо воспринят-по сути, прочитайте планы выполнения, — но, по крайней мере, его можно решить.

4. Если на CTE ссылаются более одного раза, он будет материализован. Это эвристика, не основанная на затратах. ,

5. Ты имеешь в виду постгрес, Боб? Потому что это утверждение легко опровергается в Oracle