Oracle SQL полное внешнее соединение - PullRequest
4 голосов
/ 10 ноября 2010

Я соединял 2 таблицы, используя FULL OUTER JOIN, что заняло 6 минут для запуска и выдачи вывода

SELECT * 
FROM tab1 FULL OUTER JOIN tab2
ON tab1.id = tab2.id
;

Я сделал то же самое, используя UNION LEFT OUTER JOIN и RIGHT OUTER JOIN. Это заняло всего 15 секунд

SELECT *
FROM tab1, tab2
WHERE tab1.id (+) = tab2.id

UNION 

SELECT *
FROM tab1, tab2
WHERE tab1.id  = tab2.id (+)
;

Кто-нибудь знает, почему это происходит?

Ответы [ 4 ]

3 голосов
/ 10 ноября 2010

Вероятно, у вас много строк в обеих таблицах, мало общих строк и нет индекса для рассматриваемых столбцов.

2 голосов
/ 11 ноября 2010

Проверьте объяснения планов.Имейте в виду, что два указанных вами запроса НЕ являются логически эквивалентными.Второй запрос удаляет повторяющиеся строки (UNION), а первый - нет.Это может быть частью объяснения разницы в производительности.

0 голосов
/ 11 ноября 2010

Я испытал это с Oracle 9.2. Можно обойти это, разбив FULL OUTER JOIN на левое внешнее соединение и правое анти-соединение (или что-то в этом роде?).

SELECT a.*, b.*
from tableA a
left outer join tableB b on (a.a = b.a)
union all
SELECT a.*, b.*
from tableA a
right outer join tableB b on (a.a = b.a)
where a.a is null

Это в значительной степени указанный вами запрос, но с использованием UNION ALL и удалением дубликатов из второй части запроса, а не с использованием UNION. Иногда я даже не мог получить производительность из-за этого, и мне нужно было еще больше разбить запрос, но я не мог вспомнить, что это включало.

Мне показалось, что ситуация улучшилась с Oracle 10, но FULL OUTER JOIN не то, что мне нужно очень часто, так что я не возвращался, чтобы сравнять его в последнее время.

0 голосов
/ 10 ноября 2010

FULL OUTER JOIN несколько отличается от других типов объединения, поскольку ни одна ведущая таблица не может быть выбрана.

Единственный метод, который бы эффективно ее обрабатывал, - это MERGE JOIN, однако Oracle победвыберите его.

Какой тарифный план Oracle дает по вашим запросам?

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