Неожиданные результаты выполнения запроса с помощью Left Outer Join

Вопрос:

Я столкнулся с интересной проблемой, которую я не могу понять. По сути, я работаю с некоторыми таблицами Oracle и должен модифицировать некоторый оператор создания предложения, в частности оператор exist в предложении where. Это включало в себя незначительное изменение QUERY A в предложении exists, соединяя его с другой таблицей и изменяя предложение where QUERY A. Я понял, что есть два способа сделать это:

  1. Объедините новый запрос, основанный на QUERY A, с дополнительным соединением и другим предложением where или

  2. Измените QUERY A с левым внешним соединением (так что старый присоединяется к левой внешней новой новой таблице соединений), а затем добавьте предложение или в предложение where (так что старое условие или новое условие).

Вот макет кода:

select count(*)
from table a
where condition and exists (
select *
from table1 join table2 on cond
join table3 on cond
join table4 on cond
where cond
union all
select *
from table1 join table2 on cond
join table3 on cond
join table4 on cond
join table5 on cond
where cond2);

против

select count(*)
from table a
where condition and exists (
select *
from table1 join table2 on cond
join table3 on cond
join table4 on cond
left outer join table5 on cond
where cond or cond2);

Поэтому я ожидал, что вторая версия будет работать быстрее, так как она не делает первые 3 соединения дважды; однако, оказывается, что версия 2 взята навсегда для запуска, в то время как версия 1 была относительно быстрой. Почему я должен видеть эти типы результатов? Связано ли это с плохой логикой, что 2 эквивалентны? Или оптимизатор запросов Oracle обрабатывает их по-разному под капотом? Или это может иметь какое-то отношение к индексированию? Здесь нет ничего, что нужно было бы решить здесь, но я хотел бы понять, почему результаты оказались такими. Любое понимание оценено!

Оцените статью
TechArks.Ru
Добавить комментарий