#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