Внешние объединения Oracle - производительность - PullRequest
2 голосов
/ 21 августа 2009

РЕДАКТИРОВАТЬ 9-3-10: Недавно я нашел эту запись в блоге, которая была очень поучительной. http://optimizermagic.blogspot.com/2007/12/outerjoins-in-oracle.html

Бывают случаи, когда один или другой синтаксис соединения может фактически работать лучше. Я также обнаружил, что при выборе синтаксиса соединения Oracle с ANSI-синтаксисом соединения с Oracle наблюдается небольшое увеличение производительности (заметно только в VLDB). Возможно, этого недостаточно, чтобы суетиться, но для тех, кто серьезно относится к освоению БД Oracle, может быть полезно прочитать статью.


Мне известны два синтаксиса внешнего соединения для Oracle:

select a, b
from table1 
left outer join table2
on table2.foo = table1.foo

OR

select a, b
from table1, table2
where table2.foo(+) = table1.foo

(при условии, что я правильно понял синтаксис второго примера.)

Есть ли разница в производительности между ними? Сначала я думал, что это просто предпочтение стиля со стороны разработчика, но потом я прочитал что-то, что заставило меня подумать, что, возможно, будет причина использовать один стиль вместо другого.

Ответы [ 6 ]

4 голосов
/ 21 августа 2009

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

Есть причины, но не связанные с производительностью. Внешние объединения в стиле ANSI, как и стандартные, предлагают FULL OUTER JOIN и внешние объединения для нескольких таблиц.

2 голосов
/ 21 августа 2009

Oracle не поддерживал синтаксис ANSI до версии 9i.

Начиная с этой версии, эти запросы делают то же самое и дают один и тот же план.

Правильный синтаксис пре- 9i:

SELECT  a, b
FROM    table1, table2
WHERE   table2.foo(+) = table1.foo
1 голос
/ 21 августа 2009

Теоретически, второй запрос выполняет декартово произведение двух таблиц, а затем выбирает те, которые удовлетворяют условию соединения. Однако на практике ядро ​​базы данных оптимизирует его точно так же, как и первое.

1 голос
/ 21 августа 2009

Разницы в производительности нет. Вы также можете проверить планы выполнения обоих запросов для сравнения.

0 голосов
/ 29 сентября 2009

Это не то же самое. В первом случае вы вынуждены присоединиться к столам в таком порядке. Во втором случае Oracle Planner может выбрать лучший вариант для выполнения запроса.

В этом тривиальном случае результат, вероятно, будет одинаковым во всех исполнениях, но если вы используете этот синтаксис в более сложных случаях, разница будет показана.

0 голосов
/ 21 августа 2009

Я нашел дополнительную информацию в ответ на свой вопрос. Похоже, что старый стиль очень ограничен, по состоянию на этот документ от 3 лет назад.

http://www.freelists.org/post/oracle-l/should-one-use-ANSI-join-syntax-when-writing-an-Oracle-application,2

Я думаю, что, возможно, имеет смысл использовать старый стиль, только если по какой-то причине запросы могут выполняться в устаревшей версии Oracle.

Вещи, которые я вижу на работе, почти все в старом стиле, но, вероятно, просто потому, что консультанты работают в Oracle с 9i, ​​и они, вероятно, не видят причин для обновления всего старого. 1008 *

Спасибо всем!

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