Внутреннее соединение против Где - PullRequest
243 голосов
/ 23 сентября 2008

Есть ли разница в производительности (в оракуле) между

Select * from Table1 T1 
Inner Join Table2 T2 On T1.ID = T2.ID

И

Select * from Table1 T1, Table2 T2 
Where T1.ID = T2.ID

Ответы [ 18 ]

3 голосов
/ 23 сентября 2008

В PostgreSQL, безусловно, нет никакой разницы - они оба соответствуют одному и тому же плану запросов. Я на 99% уверен, что это также относится и к Oracle.

2 голосов
/ 23 сентября 2008

Функционально они такие же, как было сказано. Хотя я согласен, что объединение лучше для описания именно того, что вы хотите сделать. Много раз я думал, что знаю, как я хочу что-то запрашивать, пока я не начал делать объединения, и понял, что хочу сделать запрос, отличный от исходного в моей голове.

1 голос
/ 23 сентября 2008

Они оба являются внутренними объединениями, которые делают одно и то же, один просто использует более новый синтаксис ANSI.

1 голос
/ 27 сентября 2008

Действительно, функционально оба запроса должны обрабатываться одинаково. Однако опыт показывает, что если вы выбираете из представлений, которые используют новый синтаксис объединения, важно также структурировать свои запросы, используя его. Оптимизатор Oracle может запутаться, если представление использует оператор «join», но запрос, обращающийся к представлению, использует традиционный метод объединения в предложении «where».

0 голосов
/ 08 августа 2017

Как сказал Кивик, план выполнения такой же.

Оператор JOIN легче читать, что упрощает не забывать условие ON и получать декартово произведение. Эти ошибки могут быть довольно трудно обнаружить в длинных запросах с использованием нескольких объединений типа: SELECT * FROM t1, t2 WHERE t1.id = t2.some_field.

Если вы забудете только одно условие соединения, вы получите очень длинный запрос на выполнение, возвращающий слишком много записей ... действительно слишком много. Некоторые люди используют DISTINCT для исправления запроса, но он все еще очень длинный для выполнения.

Именно поэтому использование оператора JOIN, безусловно, является лучшей практикой: лучшая ремонтопригодность и лучшая читаемость.

Более того, если я хорошо помню, JOIN оптимизирован в отношении использования памяти.

0 голосов
/ 03 марта 2017

Они оба объединяются и где это делают одно и то же.

Посмотрите на В запросах MySQL, зачем использовать join вместо где?

0 голосов
/ 28 октября 2014

У меня была эта загадка сегодня, когда я проверял время ожидания одного из наших sp в рабочей среде, вместо этого изменил внутреннее соединение таблицы, построенной из XML-канала, на предложение 'where' .... среднее время выполнения теперь составляет 80 мс над 1000 выполнения, тогда как до выполнения exec в среднем было 2,2 секунды ... основное различие в плане выполнения - это исчезновение поиска ключа ... Сообщение, о котором вы не узнаете, пока не протестируете с использованием обоих методов.

веселит.

0 голосов
/ 27 июня 2014

Хотя идентичность двух запросов кажется очевидной, иногда происходят странные вещи. Я пришел по запросу, который имеет разные планы выполнения при перемещении предиката соединения из JOIN в WHERE в Oracle 10g (для плана WHERE лучше), но я не могу воспроизвести эту проблему в упрощенных таблицах и данных. Я думаю, что это зависит от моих данных и статистики. Оптимизатор - довольно сложный модуль и иногда он ведет себя волшебно.

Вот почему мы не можем ответить на этот вопрос в целом, потому что это зависит от внутренних данных БД. Но мы должны знать, что ответ должен быть « без различий ».

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